WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

Ускоряем админку WordPress — отключаем агрессивную проверки обновлений

Это на мой взгляд обязательная фитча для всех сайтов на WordPress, как принято говорить - маст хэв. Почему? Потому что проверка обновлений должна идти фоном и никак иначе, за очень редким исключением! Но давайте разберемся что к чему...

Причина тормозов в админке

Думаю каждый, кто более-менее связан с WordPress замечал периодические тормоза при заходе на любую страницу админки: в консоль админки, на страницу плагинов или тем (здесь особенно!). Эти тормоза встречаются периодически: то медленно, то быстро... Происходит так из-за проверок WordPress о новых версиях: ядра, плагинов, тем и переводов...

Дело в том, что для проверки новых версий при генерации страницы PHP отправляет HTTP запрос, а точнее 3 запроса: ядро, темы, плагины... Если есть платные плагины, то на каждый плагин обычно еще один свой запрос... При HTTP запросе в PHP генерация страницы зависает пока каждый запрос не получит результат, а на каждый запрос уходит в среднем 0,5 - 1 секунд. Вот и получается, что страница виснет на 3-4 секунды.

Частота этих проверок на разных страницах админки такая:

  • На странице Консоль > Обновления - раз в минуту.
  • На странице Плагины или Внешний вид > Темы - раз в час.
  • На любой странице в админке - раз в 12 часов (два раза в день).

Кроме того, эти проверки срабатывают во время события 'admin_init', а значит при AJAX запросах. Несмотря на то что это происходит раз в пол дня, все же неприятно когда кто-то будет ловить AJAX запрос с задержкой в 3 секунды... Кроме того, такое поведение для AJAX запросов работает и во фронтэнде, а это уже прям совсем не хорошо...

Фронт и админка

Во фронте все проверки висят на кроне и от туда срабатывают в фоновом режиме. Когда пользователь заходит на сайт WP запускает крон (с определенной периодичностью), причем делает это без задержек (фоном). Если в крон-задаче наступило время проверки, то она происходит... Во фронте все хорошо и ничего не тормозит.

В админке происходит «агрессивная проверка» не фоном, а прям при генерации страницы. Сделано так для того, чтобы при заходе в админку мы сразу, в меню видели что есть обновления. Если была бы фоновая проверка, то чтобы увидеть наличие обновлений нам нужно было бы зайти на страницу еще раз. Если сравнивать этот минус с тормозами, я однозначно выбираю его!

Тормоза и объектное кэширование

Если на сайте установлен плагин объектного кэширования, то ситуация с тормозами только усугубляется. Потому что когда используется объектное кэширование, то нет никаких временных опций в базе данных - все пишется в кэш, и стоит очистить этот кэш, очищается все, включая данные о последней проверке новых версий: ядра, плагинов, тем и переводов.

Таким образом, стоит очистить объектный кэш и мы обязательно ловим 3-x секундную задержку на любой странице админки. В процессе разработки порой часто приходится очищать объектный кэш и каждый раз после очистки страница грузиться по 3-4 секунды shout

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

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

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

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

/**
 * Отключаем принудительную проверку новых версий WP, плагинов и темы в админке,
 * чтобы она не тормозила, когда долго не заходил и зашел...
 * Все проверки будут происходить незаметно через крон или при заходе на страницу: "Консоль > Обновления".
 *
 * @see https://wp-kama.ru/filecode/wp-includes/update.php
 * @author Kama (https://wp-kama.ru)
 * @version 1.0
 */
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_true' );
}

Отключение обновлений

Про то как отключать все типы автоматического обновления: ядра, тем, плагинов читайте в отдельной статье: Авто-обновления в WordPress

Плагин

По коду из этой статьи был создан плагин: Disable Aggressive Updates.

24 коммента
Полезные 1 Все
  • Антон

    После добавления кода в functions.php админка стала быстрее работать! Спасибо большое! Нужна тем кто работает с большим объемом данных! Касаемо интернет магазинов!

  • А этот вариант устранит все проверки?

    add_action('schedule_event', 'filter_cron_events');
    function filter_cron_events($event) {
    	switch( $event->hook ) {
    		case 'wp_version_check': // Проверяет версию WordPress.
    		case 'wp_update_plugins': // Проверяет версии плагинов.
    		case 'wp_update_themes': // Проверяет версии тем.
    		case 'wp_maybe_auto_update': // Выполняет автоматические обновления WordPress.
    			$event = false;
    			break;
    	}
    	return $event;
    }

    При этом варианте и Вашем варианте будет работать кнопка "Проверить снова" (WP), "Обновить сейчас" (WP) и кнопка "Обновить" (плагины) на странице обновления?

    • Kama7021

      Откуда этот код? он ведь крон события отключает только, не понимаю зачем это нужно - по крону то пусть проверяет на здоровье, вроде не мешает он...

  • Спасибо, разобрался good

  • Рэй

    Моему сайту два года. Покупал шаблон англоязычный, который включал много платных плагинов (бесплатно). Перевел почти всю структуру на родной язык, также перевел заново много некорректных фраз из вукомерс. Со временем вордпресс и Вукомерс стали обновляться, затирая переводы и некоторый функционал. Поэтому отключил все обновления, в том числе и плагинов, уже не помню точно как именно.

    Все было хорошо, товаров было около 1000, сайт терпимо загружался за 2,5 сек (по метрике яндекса), реально секунд 7. Админка стала деревяннее грузиться, но терпимо. Плагины новые не ставил. Но еще через месяцев 5-6 количество товаров уже перевалило за 2000, и сайт стал подтормаживать, а за ним и админка. Ежедневные редактирования в товарах стали адом из-за долгой загрузки. Когда "накрыло", провел два дня в поиске и тестировании решений, ничего не помогало.

    Ваш код поставил уже ради эксперимента, не думая, что чем-то сильно поможет и... он помог, нереально помог. Админка стала грузится, как грузилась еще только при 100 товарах (скорость с 20 секунд поменялась на 3-5 секунд), даже сам сайт, кажется, чуть быстрее стал загружаться (но это не точно)

    В общем, я редко пишу комментарии, но здесь не мог просто уйти. Мои благодарности и пожелания грандиозных успехов автору. Если есть донат, с удовольствием скину лавос на вкусняхи к чаю. smile

    1
    Ответить2 месяца назад #
    • Kama7021

      Интересно, что это за плагины у тебя там такие что все так висло из-за проверки обновлений?..

      Ответить2 месяца назад #
      • Рэй

        Ну там были такие встроенные в тему: Redux Framework, Regenerate Thumbnails, Slider Revolution, и я ставил стандартные, типа: RusToLat, CF7, woocommerce, Akismet, якасса, Custom Product Tabs for WooCommerce и подобное. Совсем левые плагины я не ставил, только проверенные, да и в целом их не так много - 18шт.)

        Ответить2 месяца назад #
        • Kama7021

          Очень странно, что они запросы отправляют, неужели так много? Если не трудно, поставь Query Monitor плагин, отключи этот код, зайди на страницу «Обновления» в админке и посмотри в QM какие были сделаны HTTP запросы, скрин сюда плз. Просто интересно...

          Ответить2 месяца назад #
  • Валерий

    Здравствуй, неизвестный мне Кама, без тебя была просто драма, а в данный момент настоящая нирвана!!! А, если серьезно, ОГРОМНОЕ спасибо за твой плагин, это таблетка от моей головной боли! Сайт в закладки. Тебе успехов во всем!

    Ответить5 дней назад #
Здравствуйте, !     Войти . Зарегистрироваться