WordPress как на ладони
rgbcode is looking for WordPress developers.

Ускоряем админку 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 секунды shout

Решение (отключаем тормоза)

Чтобы избавится от тормозов, но при этом не отключать проверку обновлений совсем. Вставьте следующий код в файл темы functions.php, ну или куда вы там вставляете такие коды...

Этот код полностью отключает «агрессивную» проверку обновлений в админке. Но не трогает проверку обновлений по крону. Также, если нужно проверить наличие новых версий прямо сейчас, то заходим на страницу Консоль > Обновления - там «агрессивная» проверка не отключается и срабатывает каждую минуту...

Вот так все и должно работать, на мой взгляд, из коробки. Но WP что-то слишком «услужил» с обновлениями... Возможно это изменят в будущем, хотя я сомневаюсь... Ну а пока:

GitHub
<?php

/**
 * Disable forced checking for new WP, plugins, and theme versions in the admin panel,
 * so that it doesn't slow down when you haven't visited for a long time and then visit...
 * All checks will happen unnoticed through cron or when you visit the "Dashboard > Updates" page.
 *
 * @see https://wp-kama.ru/filecode/wp-includes/update.php
 * @author Kama (https://wp-kama.ru)
 * @version 1.1
 */
if( is_admin() ){
	// disable update checks when entering the admin panel...
	remove_action( 'admin_init', '_maybe_update_core' );
	remove_action( 'admin_init', '_maybe_update_plugins' );
	remove_action( 'admin_init', '_maybe_update_themes' );

	// disable update checks when entering a special page in the admin panel...
	remove_action( 'load-plugins.php', 'wp_update_plugins' );
	remove_action( 'load-themes.php', 'wp_update_themes' );

	// leave forced checking when entering the updates page...
	//remove_action( 'load-update-core.php', 'wp_update_plugins' );
	//remove_action( 'load-update-core.php', 'wp_update_themes' );

	// leave forced checking when entering the "Update/Install Plugin" or "Update/Install Theme" page - it doesn't interfere...
	//remove_action( 'load-update.php', 'wp_update_plugins' );
	//remove_action( 'load-update.php', 'wp_update_themes' );

	// don't touch the cron event, it will be used to check for updates - everything is fine here!
	//remove_action( 'wp_version_check', 'wp_version_check' );
	//remove_action( 'wp_update_plugins', 'wp_update_plugins' );
	//remove_action( 'wp_update_themes', 'wp_update_themes' );

	/**
	 * disable the need to update the browser in the console - we always use top browsers!
	 * this check happens once a week...
	 * @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.

40 комментариев
Полезные 1 Все
    Войти