Выборочное выключение/включение автоматических фоновых обновлений. Подробный гайд.

Несмотря на то, что недавно вышла версия WordPress 4.7, я вот пишу про автоматические обновления, которые появились ещё в 3.7 версии.

Нужны они для того, чтобы упростить весь этот процесс + улучшить безопасность. Допустим залатали дыру — и на всех сайтах (где WP 3.7 и выше) всё автоматически обновилось, дыра закрыта. Всё просто.

По умолчанию автообновления включены только для технических релизов (3.7.1, 3.7.2.. ) и для файлов переводов.

Опций в админке для этого не предусмотрено, поэтому, если вы хотите внести какие-то изменения в этот процесс обновления, то вам нужно немного поработать в конфигурационном файле wp-config.php, либо в functions.php текущей темы.

Всего в WordPress существует 4 типа обновлений:

  • Обновления ядра (движка).
  • Обновления тем.
  • Обновления плагинов.
  • Обновления файлов локализации (перевода).

Обновления ядра

Этот тип обновлений подразделяется ещё на три подтипа:

  1. Версии для разработчиков (core development updates).
  2. Технические релизы, в которых обычно исправляют критические ошибки и уязвимости (minor updates).
  3. Основные релизы (например 3.7, 4.7).

Теперь всю теорию про обновления вы знаете — дальше практика :)

Как включить автоматические обновления для основных релизов WordPress, технических релизов и версий для разработчиков?

Для этого вставьте в wp-config.php следующий код. Меня кстати часто спрашивают, куда именно — отвечаю — перед строчкой «Это всё, дальше не редактируем»!

// включить все автоматические обновления ядра
define( 'WP_AUTO_UPDATE_CORE', true );

Как включить автоматические обновления только для технических релизов?

В этом вам поможет код для wp-config.php:

// включить автоматические обновления технических релизов
define( 'WP_AUTO_UPDATE_CORE', 'minor' );

Вообще эта опция включена по умолчанию, но иногда она тоже может пригодиться.

Запретить все автоматические обновления ядра WP

Это так же делается одной строчкой кода:

define( 'WP_AUTO_UPDATE_CORE', false );

Включаем автоматические фоновые обновления версий для разработчиков

Это делается кодом, вставляемым в functions.php.

add_filter( 'allow_dev_auto_core_updates', '__return_true' );

Чтобы отключить эти самые обновления, просто заменяем __return_true на __return_false, но возможно вам не придётся этого делать, так как по умолчанию они и так отключены.

Как отключить автообновления для технических релизов

Код так же для functions.php:

add_filter( 'allow_minor_auto_core_updates', '__return_false' );

Включить автообновления для основных релизов

В functions.php:

add_filter( 'allow_major_auto_core_updates', '__return_true' );

Как вы поняли, фильтры в functions.php дадут вам чуть больше возможностей настройки того, какие обновления включить, а какие выключить.

Принудительные автообновления

WordPress умеет определять, используется ли у вас система контроля версий (.git, .hg, .svn), в таком случае он не выполняет автоматические обновления. Но можно отключить это хуком в functions.php.

function true_force_auto_update( $checkout, $context ) {
	return false;
}
add_filter( 'automatic_updates_is_vcs_checkout', 'true_force_auto_update', 10, 2 );

Плагины и темы

Автообновления плагинов и тем отключены по умолчанию, но мы можем их включить. Делается всё через functions.php.

Как включить автоматические обновления плагинов в WordPress?

Этим кодом, но имейте ввиду, что это нормально, что у вас обновится к примеру какое-то расширение в WooCommerce и перестанет работать оплата на сайте. Конечно, скорее всего это исправят.. Через пару дней :)

// включить автоматические обновления плагинов
add_filter( 'auto_update_plugin', '__return_true' );

Как включить автоматические обновления тем?

При включении этой опции тоже можно ожидать всяких сюрпризов, но зависит конечно от темы, которую вы используете и от её разработчиков.

add_filter( 'auto_update_theme', '__return_true' );

А, да, ещё есть обновления локализаций

Которые включены по умолчанию и могут быть отключены этой строчкой кода:

// отключить обновления файлов перевода
add_filter( 'auto_update_translation', '__return_false' );

P.S. По умолчанию WordPress производит проверку обновлений каждые 12 часов. Конечно, если у вас всё в порядке с WP_Cron.

И ещё кое-что. После обновлений WordPress автоматически отправляет email-уведомление, которое можно отключить этим кодом:

// отключить емайл-уведомления об установке новых версий
add_filter( 'auto_core_update_send_email', '__return_false' );
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Также рекомендую руководство по полному отключению обновлений в WordPress

Комментарии 5

  • Александр15 декабря 2016 в 13:12 #

    Привет) Я спрошу немного не по теме - ты не думал написать гайд, как при создании своей платной темы для wordpress сделать возможность ее обновления для пользователя? Я вчера озадачился этим вопросом. В рунете такого не нашел )

    • n1k1c415 декабря 2016 в 14:12 #

      Обычно все платные плагины обновляются путём загрузки архива новой версии с сайта разработчика.

    • Миша15 декабря 2016 в 16:12 #

      Привет, думал) Напишу возможно со временем, там на самом деле много интересных моментов.

      • Александр15 декабря 2016 в 17:12 #

        Блин. Придется самому писать )) Хотя нагуглил пару вариантов

        https://github.com/YahnisElsts/wp-update-server
        https://code.tutsplus.com/tutorials/create-a-license-controlled-update-system-doing-the-update--cms-22675

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Привет, ну либо через Javascript, либо через save_post хук, скорее второе.

  • Дмитрий: Миша, а возможно ли задать условие, что если существует meta_key, то соответствующая таксономия будет нажата в метабоксе...

  • Дмитрий: Спасибо за подсказку. Получилось передать сразу нужный meta_key через value в hidden input.

  • Артем: Вот про сей хук я запамятовал)) Спасибо!

  • Миша: Думаю, что $mail_2 - пустая переменная по той простой причине, что $post->ID не существует. Глобальная переменная $po...