deactivate_plugins() — деактивация плагинов через код

Это бывает нужно для предотвращения ошибок, когда например:

  • версия установленного на сайте WordPress не поддерживается,
  • не поддерживается текущая версия PHP на сервере,
  • на блоге найден конфликтующий плагин.
deactivate_plugins( $plugins, $silent = false, $network_wide = null )
$plugins
(строка|массив) укажите один плагин в виде строки или несколько плагинов в виде массива. Указывать нужно путь к плагину относительно директории plugins, например wp-polls/wp-polls.php.
$silent
(логическое) Предотвратить выполнение хуков. По умолчанию false — хуки выполняются. Бывает true, когда например плагин выключается и включаются во время обновления.
$network_wide
Может принимать значения false, true и null (по умолчанию — деактивируем плагин для всех сайтов сети).

Функцию рекомендуется использовать внутри хука admin_init.

Пример 1. Деактивируем плагин в случае, когда текущая версия WordPress не поддерживается

В данном примере код будет относиться именно к текущему плагину. Код вставляем в главный файл плагина.

// допустим, что минимальная версия WordPress должна быть 2.8
if ( version_compare( floatval( get_bloginfo( 'version' ) ), '2.8', '<' ) ) { // если меньше 2.8
 
	// деактивируем
	add_action( 'admin_init', 'true_plugin_off' );
	function true_plugin_off() {
		deactivate_plugins( plugin_basename( __FILE__ ) );
	}
 
	// добавляем соответствующее уведомление
	add_action( 'admin_notices', 'true_plugin_uvedomlenie' );
	function true_plugin_uvedomlenie() {
		echo '<div class="updated">Плагин <p><strong>{название плагина}</strong> был отключен, так как не поддерживается версией WordPress ниже 2.8.</p></div>';
 
		// также сносим параметр из URL, чтобы не выполнилось ничего лишнего
		if ( isset( $_GET['activate'] ) )
			unset( $_GET['activate'] );
	}
 
} else {
    // тут будет находиться весь остальной код плагина
}
Автоматическое отключение плагина в случае неподдерживаемости версии WordPress

Пример 2. Отключаем плагин непосредственно из кода темы или из другого плагина.

Деактивировать плагин через тему очень просто, для этого вам нужно лишь правильно указать путь к главному исполняемому файлу плагина относительно папки plugins.

Код для functions.php:

add_action( 'admin_init', 'true_plugin_off_in_theme' );
 
function true_plugin_off_in_theme() {
	deactivate_plugins( 'true-instagram-widget/true-instagram-widget.php' );
}

Этот же код подойдёт, если мы отключаем один плагин через код другого.

Хуки функции

Всего в функции три хука и все они будут задействованы, если параметр $silent не установлен в значение true.

В самом начале, ещё перед тем, как плагин(ы) деактивирован запускается:

do_action( 'deactivate_plugin', $plugin, $network_deactivating );

После же деактивации запускаются сразу два:

do_action( 'deactivate_' . $plugin, $network_deactivating );
do_action( 'deactivated_plugin', $plugin, $network_deactivating );

Пара слов про параметры:

$plugin
По сути то же самое, что и параметр функции $plugins, но только для одного плагина, не бывает массивом.
$network_deactivating
Аналог параметра $network_wide, единственное отличие, что сюда также включена проверка на то, активирован ли плагин для сети или нет.

Обратите внимание, что все эти хуки задействованы внутри цикла для каждого из плагинов (это если параметр $plugins — массив).

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

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

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.