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

В WP можно разом полностью отключить проверку обновлений всего (ядра, тем, плагинов и переводов). Для этого нужно указать true в константе DISALLOW_FILE_MODS. Однако, нет стандартного способа полностью отключить проверку обновлений только файлов ядра или плагинов/тем.

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

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

Правильно отключаем проверку обновлений ядра WP

Отключаем обновления ядра WP, но оставляем обновления переводов ядра

add_filter( 'pre_set_site_transient_update_core', static function( $upinfo ) {
	$upinfo->updates = [];

	return $upinfo;
} );

В этом случае WP будет делать HTTP запрос на получение новых версий, но их мы обнуляем и в результате останутся только данные обновлений для переводов ядра.

Отключаем проверку обновлений ядра и переводов для ядра WP

add_filter( 'pre_site_transient_update_core', static function( $value ) {

	$upinfo = new stdClass();
	$upinfo->updates = [];
	$upinfo->version_checked = $GLOBALS['wp_version'];
	$upinfo->last_checked = time();

	return $upinfo;
} );

В этом случае WP не будет делать HTTP запрос на получение новых версий и соответственно никаких обновлений не будет.

Смотрите Смотрите: wp_version_check().

Подробности

Теперь, если интересно, погрузимся в детали.

Как это работает?

Чтобы узнать появились ли новые версии, WordPress делает запросы к официальному серверу обновлений и сохраняет результат во временные опции:

  • update_core - для ядра WordPress.
  • update_plugins - для плагинов.
  • update_themes - для тем.

Изменить значение каждой опции можно через хуки:

  • pre_site_transient_{$option_name} - при получении. Пр: pre_site_transient_update_core.
  • pre_set_site_transient_{$option_name} - при обновлении. Пр: pre_set_site_transient_update_core.

Почему я решил написать об этом?

В интернете часто можно найти такой способ отключения обновлений ядра:

add_filter( 'pre_site_transient_update_core', '__return_null' );

Этот код работает, но неправильно:

  • Не позволяет проверять обновления для переводов ядра WordPress.
  • Не отключает HTTP запрос на проверку обновлений ядра.
  • Создает PHP нотисы в админке.

Чтобы это исправить, нам нужно вернуть не null, а объект данных, только подменить в нем данные так, чтобы WP "думал", что обновлений нет.

Правильный код, который решает эти недостатки, смотрите выше.

При чем тут переводы?

Если мы заглянем в функцию wp_get_translation_updates(), мы увидим, что для получения данных об обновлениях перевода, как и в функции wp_version_check(), данные берутся из get_site_transient( 'update_core' ).

Эти данные выглядят так:

stdClass Object (
	[updates] => Array (
		[0] => stdClass Object (
			[response] => latest
			[download] => https://downloads.wordpress.org/release/wordpress-6.3.1.zip
			[locale] => en_US
			[current] => 6.3.1
			[version] => 6.3.1
			[php_version] => 7.0.0
			[mysql_version] => 5.0
		)

	)
	[last_checked] => 1696017321
	[version_checked] => 6.3.1
	[translations] => Array (
		[0] => Array (
			[type] => core
			[slug] => default
			[language] => ru_RU
			[version] => 6.3.1
			[updated] => 2023-09-27 08:44:56
			[package] => https://downloads.wordpress.org/translation/core/6.3.1/ru_RU.zip
			[autoupdate] => 1
		)
	)
)

Как мы видим в элементе translations находятся данные о версии перевода. И если полностью отключить запрос или заменить его на null, то и данных о новых версиях переводов не будет.

Отключаем проверку обновлений тем

Отключает проверку (включая отправку HTTP запроса на сервер обновлений):

add_filter( 'pre_site_transient_update_themes', static function( $value ) {
	static $themes;
	$themes || $themes = wp_get_themes();

	$upinfo = new stdClass();
	$upinfo->last_checked = time();
	$upinfo->checked = [];

	foreach ( $themes as $theme ) {
		$upinfo->checked[ $theme->get_stylesheet() ] = $theme->get( 'Version' );
	}

	return $upinfo;
} );

Смотрите: wp_update_themes().

Отключаем проверку обновлений плагинов

Всех плагинов

Отключает проверку (включая отправку HTTP запроса на сервер обновлений):

// update plugins check remove
add_filter( 'pre_site_transient_update_plugins', static function( $value ) {
	static $plugins;
	$plugins || $plugins = get_plugins();

	$upinfo = new stdClass();
	$upinfo->last_checked = time();
	$upinfo->checked = [];

	foreach ( $plugins as $file => $p ) {
		$upinfo->checked[ $file ] = $p['Version'];
	}

	return $upinfo;
} );

Указанных плагинов

Есть несколько способов отключить обновление конкретного плагина.

Способ 1: изменение версии плагина

При проверке сравниваются версии текущего плагина и плагина в каталоге WP, если версия в каталоге выше, то предлагается обновить плагин. Т.е. все что вам нужно сделать, это открыть плагин и изменить его версию на заведомо высшую.

Например, у вас есть плагин wp-super-cache и нужно отключить его обновления. Открываем главный файл плагина wp-cache.php. Для этого переходим в Админку > Плагины > Редактор > Выбор плагина и видим в начале такие строки:

<?php
/*
Plugin Name: WP Super Cache
Plugin URI: https://wordpress.org/plugins/wp-super-cache/
Description: Very fast caching plugin for WordPress.
Version: 1.4.7
Author: Automattic
Author URI: https://automattic.com/
License: GPL2+
Text Domain: wp-super-cache
*/

Заменяем версию, строку в строке Version: 1.4.7 на Version: 99991.4.7 и сохраняем изменения.

Готово! Теперь у вас самая старшая версия плагина, и обновлять её на меньшую WP никогда не будет...

Способ 2: вставка кода в плагин

Вставь вот такой код в основной файл плагина и готово!

add_filter( 'pre_site_transient_update_plugins', 'wpkama_disable_plugin_update' );

function wpkama_disable_plugin_update( $value ){

	if( ! is_object( $value ) ){
		return $value;
	}

	// удаляем текущий плагин из списка
	unset( $value->response[ plugin_basename( __FILE__ ) ] );

	return $value;
}
Способ 2.1: код для functions.php

Если вставлять код в плагин не вариант, то предыдущий код можно использовать за пределами плагина, чтобы отменить проверку его обновлений. Вставлять в плагин удобно, потому что там мы можем динамически получить его базовое им, которое обычно такое: название папки плагина/главный файл плагина.php.

Пример для плагина Akismet:

add_filter( 'pre_site_transient_update_plugins', static function( $value ) {
	unset( $value->response['akismet/akismet.php'] );

	return $value;
} );

Смотрите wp_update_plugins().