Zmień częstotliwość automatycznych aktualizacji wtyczek WordPress
Obecnie (w wersji 6.4.2) WordPress planuje kontrole co 12 godzin od Pierwszy czas ładowania strony powoduje wywołanie tej funkcji wp-includes/update.php
:
function wp_schedule_update_checks() {
if ( ! wp_next_scheduled( 'wp_version_check' ) && ! wp_installing() ) {
wp_schedule_event( time(), 'twicedaily', 'wp_version_check' );
}
if ( ! wp_next_scheduled( 'wp_update_plugins' ) && ! wp_installing() ) {
wp_schedule_event( time(), 'twicedaily', 'wp_update_plugins' );
}
if ( ! wp_next_scheduled( 'wp_update_themes' ) && ! wp_installing() ) {
wp_schedule_event( time(), 'twicedaily', 'wp_update_themes' );
}
}
Kolejne wystąpienia są zaplanowane przez wp-cron.php
powołanie wp_reschedule_event
który dodaje kolejne 12 godzin (lub kilka wielokrotności 12 godzin, jeśli to konieczne) do istniejącego znacznika czasu, a następnie wywołuje wp_schedule_event
Ponownie.
Częściowo zainspirowany Twoim pytaniem, używam tego filtra, aby ograniczyć zakres czasu, w którym mogą wystąpić aktualizacje:
// Only allow auto-updates during Mon-Thu mornings so we'll have time during business hours to fix any problems that arise.
// See also wp-admin/includes/class-wp-automatic-updater.php
function my_auto_update( $update, $item ) {
$tz = new DateTimeZone('America/Chicago');
$now = new DateTimeImmutable('now', $tz);
if ($now < new DateTimeImmutable('07:50', $tz)) $update = false;
if ($now > new DateTimeImmutable('12:00', $tz)) $update = false;
//
// 1 (for Monday) through 7 (for Sunday)
if ($now->format('N') >= 5) $update = false;
// otherwise, use the normal API response to decide whether to update or not
return $update;
}
add_filter( 'auto_update_core', 'my_auto_update', 10, 2 );
add_filter( 'auto_update_plugin', 'my_auto_update', 10, 2 );
add_filter( 'auto_update_theme', 'my_auto_update', 10, 2 );
add_filter( 'auto_update_translation', 'my_auto_update', 10, 2 );
ale dodałem także drugi filtr, aby dostosować zaplanowany razy, jak mi się podoba:
// Override default arbitrary twicedaily timing of wp_schedule_update_checks (in wp-includes/update.php) to choose a specific time that potentially satisfies the above filter, so we won't continually miss our window by sheer bad luck.
// Note that we still need a page load at an acceptable time to actually trigger the task; see also
function my_schedule_autoupdate($event) {
switch ($event->hook) {
case 'wp_version_check':
case 'wp_update_plugins':
case 'wp_update_themes':
$desired_time = new DateTime('07:50', new DateTimeZone('America/Chicago'));
if ($desired_time->getTimestamp() < time()) $desired_time->modify('+1 day');
$event->timestamp = $desired_time->getTimestamp();
$event->schedule = "daily";
}
return $event;
}
add_filter( 'schedule_event', 'my_schedule_autoupdate' );
To wciąż nie gwarantuje sukcesu, ponieważ WP-Cron jest uruchamiany tylko podczas ładowania strony; co się stanie, jeśli nikt nie będzie przeglądał witryny w akceptowalnym oknie aktualizacji? Ten ostatni element układanki można rozwiązać, używając systemowego crona do uruchomienia WP-Cron w pożądanym czasie, w moim przypadku:
# min hr dom mon dow command
55 7 * * 1-4 curl --insecure
uwaga: efekt uboczny my_auto_update
jest to, że strona Wtyczki > Zainstalowane wtyczki wyświetla komunikat „Automatyczne aktualizacje wyłączone” dla każdej wtyczki, chyba że odwiedzisz ją w dopuszczalnych godzinach. Nie spędziłem czasu próbując obejść to kodem; kiedy muszę włączyć automatyczną aktualizację nowych wtyczek, mogę albo pamiętać o zrobieniu tego rano, albo mogę najpierw tymczasowo wyłączyć filtr. (Oczywiście nie musiałbym w ogóle ręcznie włączać automatycznej aktualizacji nowych wtyczek, gdyby mój filtr wyraźnie zwrócił true
w akceptowalnym przedziale czasowym, ale utrudniłoby to również wykluczenie konkretnej wtyczki z automatycznej aktualizacji).