WordPress

Zmień częstotliwość automatycznych aktualizacji wtyczek WordPress

  • 12 sierpnia, 2014
  • 3 min read
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_eventktó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).

Warto przeczytać!  dostosowywanie motywu — Jak wyłączyć przycinanie ikony witryny?


Źródło