Активация/деактивация плагина

Хуки для активации и деактивации плагина WordPress обеспечивают выполнение PHP действий, когда плагин активируется или деактивируется, а также есть хук для удаления плагина, но он немного отличается от текущих и о нем поговорим в другом разделе.

При активации как правило нужно запустить процедуру установки плагина, чтобы, например:

  • добавить опции (настройки) по умолчанию
  • установить таблицы базы данных
  • добавить правила ЧПУ
  • создать директории
  • и т.д.

При деактивации обычно очищают временные данные:

  • кеш во временных опциях
  • файлы во временных каталогах. Например, плагин страничного кэширования WP Super Cache при дезактивации удаляет все созданные файлы кэша.

Хук деактивации иногда путают с хуком деинсталляции (удаления), однако это совсем разные хуки, они работают по-разному и сфера их применения тоже разная. При удалении обычно удаляются все данные плагина, включая опции, таблицы в БД и т.д. О деинсталляции все данные удаляются, процедура включения хука другая о ней мы еще поговорим...

Чтобы вызвать PHP функцию при активации, используйте register_activation_hook() в основном файле плагина:

register_activation_hook( __FILE__, 'myplugin_activation' );

Чтобы вызвать PHP функцию при деактивации используйте register_deactivation_hook(), также в основном файле плагина:

register_deactivation_hook( __FILE__, 'myplugin_function_to_run' );

Первый параметр в каждой функции - это путь к основному файлу плагина - это файл с заголовками плагина.

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

Как работает активация

Плагин активируется функцией activate_plugin(), в которой срабатывает хук activate_(plugin).

Функция activate_plugin() в ядре вызывается уже после загрузки среды ВП. Эта функция подключает главный файл плагина (и все что в нем указано), а затем через хук активирует указанную callback-функцию. За счет этого в нашей callback-функции доступны все функции и классы плагина. Но, так как все основные хуки WP уже сработали во время загрузки среды ВП, то никакие события плагина повешенные на хуки, например plugins_loaded, уже не сработают при подключении главного файла плагина. А значит наш плагин будет подключен, но не полностью: не так как он должен подключаться, когда уже активирован.

Так, например, если плагин делает что-либо во время события plugins_loaded, то все эти действия просто не произойдут при активации плагина. Например, если он подключает файл перевода, то файл перевода не будет подключен в момент срабатывания callback-функции указанной для register_activation_hook().

Как правило, после срабатывания callback-функции есть 2 события на которые можно повесить функции: activated_plugin и shutdown.

Чтобы сделать что-то неординарное при активации плагина, смотрите пример 5.

Пример активации плагина

Одним из распространенных случаев для хука активации - это обновление настроек ЧПУ WordPress с помощью flush_rewrite_rules(), когда плагин регистрирует произвольный тип записи. Это позволяет избавиться от неприятных ошибок 404. Давайте посмотрим на примере:

add_action( 'init', 'myplugin_setup_post_type' );
function myplugin_setup_post_type(){
	// Регистрируем тип записи "book"
	register_post_type('book', array(
		'public' => 'true'
	) );
}

register_activation_hook( __FILE__, 'myplugin_install' );
function myplugin_install(){
	// Запускаем функцию регистрации типа записи
	myplugin_setup_post_type();

	// Сбрасываем настройки ЧПУ, чтобы они пересоздались с новыми данными
	flush_rewrite_rules();
}

Если вы не знакомы с регистрацией произвольных типов записей, то прочитайте описание функции register_post_type().

Активация плагина для сети Мультисайт

Довольно часто при активации плагина нужно что-либо добавить в БД сайта. Но в таком случае активация плагина для сети сайтов сводится к тому, что нужно сделать одно и тоже для всех сайтов сети. Автоматически register_activation_hook() этого не делает.

Поэтому для сети сайтов вам нужно будет при активации плагина пройтись по всем сайтам сети и сделать с каждым сайтом, то что надо сделать при активации:

register_activation_hook( __FILE__, 'my_plugin_activate' );

function my_plugin_activate( $network_wide ){

	// require_once ABSPATH . 'wp-admin/includes/upgrade.php';

	if( is_multisite() && $network_wide ){

		global $wpdb;

		foreach( $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs") as $blog_id ){

			switch_to_blog($blog_id);

			_activate_plugin_for_site();

			restore_current_blog();
		}

	} else {
		_activate_plugin_for_site();
	}

}

function _activate_plugin_for_site(){
	// код активации для каждого сайта
}

Также нужно учесть, что при создании очередного сайта сети его тоже нужно обработать. Для этого проводим процедуру активации плагина при создании сайта сети:

add_action( 'wp_initialize_site', 'my_plugin_new_blog', 10, 2 );

function my_plugin_new_blog( $new_site, $args ){

	// замените на базовое имя вашего плагина. Пр.: dirname/filename.php
	if( is_plugin_active_for_network( 'my-plugin-dir/my-plugin-name.php' ) ) {
		switch_to_blog( $new_site->site_id );

		// тут делаем что нужно при активации...

		restore_current_blog();
	}

}

Если нужен такой функционал для всех плагинов, которые активируются сетью (а не только для того который вы разрабатываете), обратите внимание на плагин Proper Network Activation. Он делает так, что register_activation_hook и register_deactivation_hook будут запущены для каждого сайта сети в контексте этого сайта.

Пример деактивации плагина

Теперь при деактивации нам нужно опять сбросить правила ЧПУ, потому что при деактивации наш тип записи будет удален. Т.е. это обратный процесс тому, что был выше при активации:

register_deactivation_hook( __FILE__, 'myplugin_deactivation' );
function myplugin_deactivation() {
	// Тип записи не регистрируется, а значит он автоматически удаляется - его не нужно удалять как-то еще.

	// Сбрасываем настройки ЧПУ, чтобы они пересоздались с новыми данными
	flush_rewrite_rules();
}

-

Больше примеров, как правильно использовать функции активации/деактивации смотрите в описании этих функций:

Функция удаления плагина

Кроме активации и деактивации, важным моментом является удаление плагина. Подключится к этому процессу можно через функцию

Подробнее о том как правильно удалять плагины читайте в специальной статье.