Ускоряем админку WordPress — отключаем агрессивную проверки обновлений
Это, на мой взгляд, обязательная фитча для всех сайтов на WordPress, как принято говорить - маст хэв. Почему? Потому что проверка обновлений должна идти фоном и никак иначе, за очень редким исключением! Давайте разберемся что к чему.
Как полностью отключить авто-обновления для ядра, тем, плагинов, читайте в отдельной статье: Авто-обновления в WordPress.
Причина тормозов в админке
Думаю каждый, кто более-менее связан с WordPress замечал периодические тормоза при заходе на любую страницу админки: в консоль админки, на страницу плагинов или тем (здесь особенно!). Эти тормоза встречаются периодически: то медленно, то быстро.
Происходит так из-за проверок WordPress о новых версиях: ядра, плагинов, тем и переводов.
Дело в том, что для проверки новых версий при генерации страницы PHP отправляет HTTP запрос, а точнее 3 запроса: ядро, темы, плагины. Если есть платные плагины, то на каждый плагин обычно еще один свой запрос. При HTTP запросе в PHP генерация страницы зависает пока каждый запрос не получит результат, а на каждый запрос уходит в среднем 0,3 - 1 секунда. Вот и получается, что страница виснет на 2-4 секунды.
Частота этих проверок на разных страницах админки такая:
- На странице
Консоль Обновления
- раз в минуту. - На странице
Плагины
илиВнешний вид > Темы
- раз в час. - На любой странице в админке - раз в 12 часов (два раза в день).
Кроме того, эти проверки срабатывают во время события 'admin_init', а значит при AJAX запросах. Несмотря на то что это происходит раз в пол дня, все же неприятно когда кто-то будет ловить AJAX запрос с задержкой в 3 секунды... Кроме того, такое поведение для AJAX запросов работает и во фронтэнде, а это уже совсем нехорошо...
Фронт и админка
Во фронте все проверки висят на кроне и от туда срабатывают в фоновом режиме. Когда пользователь заходит на сайт WP запускает крон (с определенной периодичностью), причем делает это без задержек (фоном). Если в крон-задаче наступило время проверки, то она происходит... Во фронте все хорошо и ничего не тормозит.
В админке происходит «агрессивная проверка» не фоном, а прям при генерации страницы. Сделано так для того, чтобы при заходе в админку мы сразу, в меню видели что есть обновления. Если была бы фоновая проверка, то чтобы увидеть наличие обновлений нам нужно было бы зайти на страницу еще раз. Если сравнивать этот минус с тормозами, я однозначно выбираю его!
Тормоза и объектное кэширование
Если на сайте установлен плагин объектного кэширования, то ситуация с тормозами только усугубляется. Потому что когда используется объектное кэширование, то нет никаких временных опций в базе данных - все пишется в кэш, и стоит очистить этот кэш, очищается все, включая данные о последней проверке новых версий: ядра, плагинов, тем и переводов.
Таким образом, стоит очистить объектный кэш и мы обязательно ловим 3-x секундную задержку на любой странице админки. В процессе разработки порой часто приходится очищать объектный кэш и каждый раз после очистки страница грузиться по 3-4 секунды
Решение (отключаем тормоза)
Чтобы избавится от тормозов, но при этом не отключать проверку обновлений совсем. Вставьте следующий код в файл темы functions.php, ну или куда вы там вставляете такие коды...
Этот код полностью отключает «агрессивную» проверку обновлений в админке. Но не трогает проверку обновлений по крону. Также, если нужно проверить наличие новых версий прямо сейчас, то заходим на страницу Консоль > Обновления
- там «агрессивная» проверка не отключается и срабатывает каждую минуту...
Вот так все и должно работать, на мой взгляд, из коробки. Но WP что-то слишком «услужил» с обновлениями... Возможно это изменят в будущем, хотя я сомневаюсь... Ну а пока:
/** * Отключаем принудительную проверку новых версий WP, плагинов и темы в админке, * чтобы она не тормозила, когда долго не заходил и зашел... * Все проверки будут происходить незаметно через крон или при заходе на страницу: "Консоль > Обновления". * * @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' ); // внутренняя страница админки "Update/Install Plugin" или "Update/Install Theme" - оставим не мешает... //remove_action( 'load-update.php', 'wp_update_plugins' ); //remove_action( 'load-update.php', 'wp_update_themes' ); // событие крона не трогаем, через него будет проверяться наличие обновлений - тут все отлично! //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_transient_browser_'. md5( $_SERVER['HTTP_USER_AGENT'] ), '__return_empty_array' ); }
Плагин
По коду из этой статьи был создан плагин: Disable Aggressive Updates.