УСКОРЕНИЕ ВП-АДМИНКИ — ОТКЛЮЧЕНИЕ АГРЕССИВНЫХ ПРОВЕРОК ОБНОВЛЕНИЙ
На мой взгляд, это обязательная функция для всех сайтов на WordPress. Почему? Потому что проверки обновлений должны выполняться в фоновом режиме, а не во время работы админки, за редкими исключениями! Давайте разберемся подробнее.
ПРИЧИНЫ МЕДЛЕНИЯ В АДМИН-ПАНЕЛИ
Каждый, кто так или иначе связан с WordPress, заметил, что иногда админка подтормаживает, когда открываешь любую страницу: админ-консоль, страницы плагинов или тем (особенно это заметно здесь!). Эти медления происходят периодически: иногда все работает быстро, а иногда — медленно.
Это связано с тем, что WordPress проверяет наличие новых версий: ядра, плагинов, тем и переводов.
Чтобы проверить новые версии, PHP отправляет HTTP-запрос при генерации страницы, а на самом деле — три запроса: для ядра, темы и плагинов. Если есть платные плагины, то обычно добавляется еще один запрос для каждого из них. Когда PHP отправляет HTTP-запрос, генерация страницы «зависает», пока не будет получен ответ на каждый из запросов, а это занимает в среднем от 0.3 до 1 секунды. Таким образом, страница может «зависнуть» на 2-4 секунды.
Частота этих проверок на разных страницах админки следующая:
- На странице «Обновления» — каждую минуту.
- На страницах «Плагины» или «Внешний вид > Темы» — каждый час.
- На любой странице в админ-панели — каждые 12 часов (два раза в день).
Кроме того, эти проверки срабатывают во время события admin_init
, что означает, что это происходит во время AJAX-запросов. Несмотря на то, что это происходит раз в полдня, это все равно неприятно, когда кто-то получает задержку в 3 секунды...
ФРОНТЕНД И АДМИН-ПАНЕЛЬ
На фронтенде все проверки выполняются через cron и запускаются в фоновом режиме. Когда пользователь заходит на сайт, WP запускает cron (с определенной частотой) без задержек. Если пришло время для проверки в задании cron, то она осуществляется... В этом плане все хорошо, и ничего не тормозит.
В админ-панели "агрессивная проверка" происходит не в фоновом режиме, а непосредственно во время генерации страницы. Это делается для того, чтобы мы сразу видели в меню уведомление о наличии обновлений. Если бы проверка происходила в фоновом режиме, нужно было бы обновлять страницу, чтобы увидеть наличие обновлений. Если сравнить этот недостаток с тормозами, я определенно выберу тормоза!
МЕДЛЕНИЯ И КЕШ ОБЪЕКТОВ
Если на сайте установлен плагин кеширования объектов, ситуация с медлительностью только ухудшается. Дело в том, что при использовании кеширования объектов временные данные в базе данных отсутствуют, так как все записывается в кеш, и при его очистке очищаются все данные, включая информацию о последней проверке новых версий: ядра, плагинов, тем и переводов.
Таким образом, очистка кеша объектов приводит к задержке на 3 секунды на любой странице админки. Во время разработки часто требуется очищать кеш объектов, и после каждого очищения страница загружается на 3-4 секунды дольше.
РЕШЕНИЕ (ОТКЛЮЧЕНИЕ МЕДЛЕНИЙ)
Чтобы избавиться от медлений, но при этом не отключать полностью проверки обновлений, вставьте следующий код в файл functions.php
вашей темы или туда, где вы обычно добавляете такие коды:
Этот код полностью отключает "агрессивные" проверки обновлений в админ-панели, но не влияет на проверки обновлений через cron. Также, если вам нужно проверить новые версии прямо сейчас, перейдите на страницу «Обновления» — там "агрессивная" проверка не отключена и осуществляется каждую минуту...
Вот как все должно работать, на мой взгляд, из коробки. Однако WP «переусердствовал» с обновлениями... Возможно, они изменят это в будущем, хотя я сомневаюсь... Но на данный момент:
<?php
/**
- Отключить принудительные проверки новых версий WP, плагинов и тем в админ-панели,
- чтобы не тормозить при длительном отсутствии.
- Все проверки будут производиться незаметно через cron или при переходе на страницу "Обновления".
- @see https://wp-kama.ru/filecode/wp-includes/update.php
- @author Kama (https://wp-kama.ru)
-
@version 1.1
*/
if( is_admin() ){
// отключить проверки обновлений при входе в админ-панель...
remove_action( 'admin_init', '_maybe_update_core' );
remove_action( 'admin_init', '_maybe_update_plugins' );
remove_action( 'admin_init', '_maybe_update_themes' );// отключить проверки обновлений при загрузке специальной страницы в админ-панели...
remove_action( 'load-plugins.php', 'wp_update_plugins' );
remove_action( 'load-themes.php', 'wp_update_themes' );// оставить принудительные проверки при переходе на страницу обновлений...
//remove_action( 'load-update-core.php', 'wp_update_plugins' );
//remove_action( 'load-update-core.php', 'wp_update_themes' );// оставить принудительные проверки при переходе на страницу "Обновление/Установка плагина" или "Обновление/Установка темы" - это не мешает...
//remove_action( 'load-update.php', 'wp_update_plugins' );
//remove_action( 'load-update.php', 'wp_update_themes' );// не трогать событие cron, оно будет использоваться для проверки обновлений - здесь все в порядке!
//remove_action( 'wp_version_check', 'wp_version_check' );
//remove_action( 'wp_update_plugins', 'wp_update_plugins' );
//remove_action( 'wp_update_themes', 'wp_update_themes' );/**
- Отключить необходимость обновления браузера в консоли - мы всегда используем современные браузеры!
- эта проверка происходит раз в неделю...
- @see https://wp-kama.ru/function/wp_check_browser_version
*/
add_filter( 'pre_site_transientbrowser' . md5( $_SERVER['HTTP_USER_AGENT'] ?? '' ), '__return_empty_array' ); // phpcs:ignore WordPress.Security
}
ПЛАГИН
На основе кода из этой статьи был создан плагин: Отключение агрессивных обновлений.