Удаление, активация, деактивация плагина: типичные функции и amp; как
Я делаю плагин wordpress. Каковы типичные вещи, которые я должен включить в функцию удаления?
Например, следует ли удалить все таблицы, созданные в функции установки?
Очистить ли мои записи параметров?
Что-нибудь еще?
2 ответа
Существует три разных крючка. Они запускаются в следующих случаях:
- Удалить
- Дезактивация
- Активация
Как безопасно запускать функции во время сценариев
Ниже показаны способы right безопасного смещения функций обратного вызова, которые запускаются во время указанных действий.
Как вы могли бы использовать этот код в плагине, который использует
- простые функции,
- класс или
- внешний класс,
Я покажу три разных демонстрационных плагина , которые вы можете проверить, а затем реализовать код в своем собственном плагине.
Важное примечание!
Поскольку этот вопрос чрезвычайно сложный и очень подробный и имеет дюжину случаев с ребрами, этот ответ никогда не будет совершенным. Я буду продолжать улучшать его с течением времени, поэтому зайдите на обычную базу.
(1) Активировать /деактивировать /удалить плагины.
Обратные вызовы настройки плагина запускаются ядром, и у вас есть no влияние на то, как это делает ядро. Есть несколько вещей, о которых нужно помнить:
-
Никогда ,
echo /print
ничего (!) во время обратных вызовов настройки. Это приведет к сообщению уже отправленныхзаголовков
, и ядро порекомендует отключить и удалить ваш плагин ... не спрашивайте: я знаю ... - Вы не будете видеть любой визуальный вывод. Но Я добавил операторы
exit ()
ко всем разным обратным вызовам, чтобы вы могли получить представление о том, что на самом деле происходит. Просто раскомментируйте их, чтобы посмотреть, как работают рабочие. - Чрезвычайно важно проверить, есть ли
__ FILE__! = WP_PLUGIN_INSTALL
и (если нет: abort!), чтобы увидеть, действительно ли удаляется плагин. Я бы рекомендовал просто вызвать обратные вызовыon_deactivation ()
во время разработки, поэтому вы сэкономите время, необходимое для того, чтобы вернуть все. По крайней мере, это то, что я делаю. - Я также делаю некоторые вещи безопасности. Некоторые делаются также ядром, но эй! Безопаснее, чем жаль! .
- Сначала я запрещаю прямой доступ к файлам, когда ядро не загружается:
defined ('ABSPATH') ИЛИ exit;
- Затем я проверяю, разрешено ли текущему пользователю выполнять эту задачу.
- В качестве последней задачи я проверяю реферер. Примечание. На экране
wp_die ()
могут появиться неожиданные результаты с запросом правильных разрешений (и если вы хотите попробовать еще раз ... да, конечно ), когда вы получили ошибка. Это происходит, когда ядро перенаправляет вас, устанавливает текущий$ GLOBALS ['wp_list_table'] -> current_action ();
вerror_scrape
, а затем проверяет реферер наcheck_admin_referer ('plugin-activation-error_'. $ plugin);
, где$ plugin
-$ _ REQUEST ['plugin']
. Таким образом, перенаправление происходит при половине загрузки страницы, и вы получаете эту проводную полосу прокрутки, а экранный экран - желтое окно уведомления администратора /сообщения. Если это произойдет: будьте спокойны и просто ищите ошибку с помощью некоторогоexit ()
и пошаговой отладки.
- Сначала я запрещаю прямой доступ к файлам, когда ядро не загружается:
(A) Плагин с плавными функциями
Помните, что это может не сработать, если вы подключите обратные вызовы до определения функции.
& л;? PHP
(«ABSPATH») ИЛИ выход;
/**
* Имя плагина: (WCM) Активировать /Деактивировать /Удалить - Функции
* Описание: Пример плагина для отображения активации /деактивации /удаления обратных вызовов для простых функций.
* Автор: Франц Йозеф Кайзер /wecodemore
* URL автора: http://unserkaiser.com
* URL-адрес плагина: http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979
* /
функция WCM_Setup_Demo_on_activation ()
{
if (! current_user_can ('activate_plugins'))
вернуть;
$ plugin = isset ($ _REQUEST ['plugin'])? $ _REQUEST ['plugin']: '';
check_admin_referer ("активировать-плагин _ {$ плагин}");
# Раскомментируйте следующую строку, чтобы увидеть функцию в действии
# exit (var_dump ($ _GET));
}
функция WCM_Setup_Demo_on_deactivation ()
{
if (! current_user_can ('activate_plugins'))
вернуть;
$ plugin = isset ($ _REQUEST ['plugin'])? $ _REQUEST ['plugin']: '';
check_admin_referer ("deactivate-plugin _ {$ plugin}");
# Раскомментируйте следующую строку, чтобы увидеть функцию в действии
# exit (var_dump ($ _GET));
}
функция WCM_Setup_Demo_on_uninstall ()
{
if (! current_user_can ('activate_plugins'))
вернуть;
check_admin_referer ('bulk-plugins');
//Важно: проверьте, является ли файл тем
//, который был зарегистрирован во время удаления.
if (__FILE__! = WP_UNINSTALL_PLUGIN)
вернуть;
# Раскомментируйте следующую строку, чтобы увидеть функцию в действии
# exit (var_dump ($ _GET));
}
register_activation_hook (__FILE__, 'WCM_Setup_Demo_on_activation');
register_deactivation_hook (__FILE__, 'WCM_Setup_Demo_on_deactivation');
register_uninstall_hook (__FILE__, 'WCM_Setup_Demo_on_uninstall');
(B) Класс на основе /ООПархитектура
Это наиболее распространенный пример в современных плагинах.
& л;? PHP
(«ABSPATH») ИЛИ выход;
/**
* Имя плагина: (WCM) Активировать /Деактивировать /Удалить - CLASS
* Описание: Пример Plugin для отображения активации /деактивации /удаления обратных вызовов для классов /объектов.
* Автор: Франц Йозеф Кайзер /wecodemore
* URL автора: http://unserkaiser.com
* URL-адрес плагина: http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979
* /
register_activation_hook (__FILE__, array ('WCM_Setup_Demo_Class', 'on_activation'));
register_deactivation_hook (__FILE__, array ('WCM_Setup_Demo_Class', 'on_deactivation'));
register_uninstall_hook (__FILE__, массив ('WCM_Setup_Demo_Class', 'on_uninstall'));
add_action ('plugins_loaded', array ('WCM_Setup_Demo_Class', 'init'));
класс WCM_Setup_Demo_Class
{
защищенный static $ instance;
public static function init ()
{
is_null (self :: $ instance) И self :: $ instance = new self;
return self :: $ instance;
}
публичная статическая функция on_activation ()
{
if (! current_user_can ('activate_plugins'))
вернуть;
$ plugin = isset ($ _REQUEST ['plugin'])? $ _REQUEST ['plugin']: '';
check_admin_referer ("активировать-плагин _ {$ плагин}");
# Раскомментируйте следующую строку, чтобы увидеть функцию в действии
# exit (var_dump ($ _GET));
}
публичная статическая функция on_deactivation ()
{
if (! current_user_can ('activate_plugins'))
вернуть;
$ plugin = isset ($ _REQUEST ['plugin'])? $ _REQUEST ['plugin']: '';
check_admin_referer ("deactivate-plugin _ {$ plugin}");
# Раскомментируйте следующую строку, чтобы увидеть функцию в действии
# exit (var_dump ($ _GET));
}
общедоступная статическая функция on_uninstall ()
{
if (! current_user_can ('activate_plugins'))
вернуть;
check_admin_referer ('bulk-plugins');
//Важно: проверьте, является ли файл тем
//, который был зарегистрирован во время удаления.
if (__FILE__! = WP_UNINSTALL_PLUGIN)
вернуть;
# Раскомментируйте следующую строку, чтобы увидеть функцию в действии
# exit (var_dump ($ _GET));
}
публичная функция __construct ()
{
# INIT плагин: зацепить ваши обратные вызовы
}
}
(C) Архитектура на основе класса /ООП с внешним объектом настройки
В этом сценарии предполагается, что у вас есть основной файл плагина и второй файл с именем setup.php
в подкаталоге плагина с именем inc
: ~ /wp -поперечник /плагины /your_plugin /вкл /setup.php
. Это также сработает, когда папка плагина находится за пределами структуры папок WP по умолчанию, а также при переименовании каталога данных или в тех случаях, когда ваш файл установки назван другим. Только папка inc
должна иметь одно и то же имя & местоположение относительно корневого каталога плагинов.
Примечание. Вы можете просто взять три функции register _ * _ hook () *
и классы и поместить их в свой плагин.
Основной файл плагина:
& л;? PHP
(«ABSPATH») ИЛИ выход;
/**
* Имя плагина: (WCM) Активировать /деактивировать /удалить - FILE /CLASS
* Описание: Пример плагина
* Автор: Франц Йозеф Кайзер /wecodemore
* URL автора: http://unserkaiser.com
* URL-адрес плагина: http://wordpress.stackexchange.com/questions/25910/uninstall-activate-deactivate-a-plugin-typical-features-how-to/25979#25979
* /
register_activation_hook (__FILE__, array ('WCM_Setup_Demo_File_Inc', 'on_activation'));
register_deactivation_hook (__FILE__, array ('WCM_Setup_Demo_File_Inc', 'on_deactivation'));
register_uninstall_hook (__FILE__, array ('WCM_Setup_Demo_File_Inc', 'on_uninstall'));
add_action ('plugins_loaded', array ('WCM_Setup_Demo_File', 'init'));
класс WCM_Setup_Demo_File
{
защищенный static $ instance;
public static function init ()
{
is_null (self :: $ instance) И self :: $ instance = new self;
return self :: $ instance;
}
публичная функция __construct ()
{
add_action (current_filter (), array ($ this, 'load_files'), 30);
}
public function load_files ()
{
foreach (glob (plugin_dir_path (__FILE__). 'inc /*. php') как $ file)
include_once $ file;
}
}
Установочный файл:
& л;? PHP
(«ABSPATH») ИЛИ выход;
класс WCM_Setup_Demo_File_Inc
{
публичная статическая функция on_activation ()
{
if (! current_user_can ('activate_plugins'))
вернуть;
$ plugin = isset ($ _REQUEST ['plugin'])? $ _REQUEST ['plugin']: '';
check_admin_referer ("активировать-плагин _ {$ плагин}");
# Раскомментируйте следующую строку, чтобы увидеть функцию в действии
# exit (var_dump ($ _GET));
}
публичная статическая функция on_deactivation ()
{
if (! current_user_can ('activate_plugins'))
вернуть;
$ plugin = isset ($ _REQUEST ['plugin'])? $ _REQUEST ['plugin']: '';
check_admin_referer ("deactivate-plugin _ {$ plugin}");
# Раскомментируйте следующую строку, чтобы увидеть функцию в действии
# exit (var_dump ($ _GET));
}
общедоступная статическая функция on_uninstall ()
{
if (! current_user_can ('activate_plugins'))
вернуть;
check_admin_referer ('bulk-plugins');
//Важно: проверьте, является ли файл тем
//, который был зарегистрирован во время удаления.
if (__FILE__! = WP_UNINSTALL_PLUGIN)
вернуть;
# Раскомментируйте следующую строку, чтобы увидеть функцию в действии
# exit (var_dump ($ _GET));
}
}
(2) Обновления плагинов
Если вы пишете плагин с собственной таблицей или параметрами БД, могут возникнуть сценарии, в которых вам нужно изменить или обновить вещи.
К сожалению, до сих пор нет возможности запускать что-то в установке /обновлении /обновлении плагинов /тем. Рад, что есть работа: Подключите пользовательскую функцию к настраиваемой опции (да, она хромая, но она работает).
функция prefix_upgrade_plugin ()
{
$ v = 'plugin_db_version';
$ update_option = null;
//Обновление до версии 2
if (2! == get_option ($ v))
{
if (2 <get_option ($ v))
{
//Функция обратного вызова должна возвращать true при успешном завершении
$ update_option = custom_upgrade_cb_fn_v3 ();
//Только вариант обновления, если он был успешным
if ($ update_option)
update_option ($ v, 2);
}
}
//Обновление до версии 3, выполняется сразу после обновления до версии 2
if (3! == get_option ($ v))
{
//повторное выполнение с начала, если предыдущее обновление не выполнено
if (2 <get_option ($ v))
return prefix_upgrade_plugin ();
if (3 <get_option ($ v))
{
//Функция обратного вызова должна возвращать true при успешном завершении
$ update_option = custom_upgrade_cb_fn_v3 ();
//Только вариант обновления, если он был успешным
if ($ update_option)
update_option ($ v, 3);
}
}
//Возвращаем результат из cb fn обновления, поэтому мы можем проверить на успех /сбой /ошибку
if ($ update_option)
return $ update_option;
return false;
}
add_action ('admin_init', 'prefix_upgrade_plugin');
Эта функция обновления является не очень приятным /хорошо написанным примером, но, как сказано: Это пример, и этот метод работает хорошо. Улучшит это с последующим обновлением.
Чтобы протестировать текущую систему для требуемых функций, таких как PHP-версия или установленные расширения, вы можете использовать что-то вроде этого:
<? php # - * - кодирование: utf-8 - * -
/**
* Название плагина: T5 Check Plugin Requirements
* Описание: Тест для версии PHP и установленных расширений
* URI плагина:
* Версия: 2013.03.31
* Автор: Томас Шольц
* Авторский URI: http://toscho.de
* Лицензия: MIT
* URI лицензии: http://opensource.org/licenses/MIT
* /
/*
* Не начинайте работу на каждой странице, достаточно страницы плагина.
* /
if (! empty ($ GLOBALS ['pagenow']) & & 'plugins.php' === $ GLOBALS ['pagenow'])
add_action ('admin_notices', 't5_check_admin_notices', 0);
/**
* Проверить текущую систему для функций, которые требуется плагину.
*
* @return array Ошибки или пустой массив
* /
функция t5_check_plugin_requirements ()
{
$ php_min_version = '5.4';
//см. http://www.php.net/manual/en/extensions.alphabetical.php
$ extensions = array (
'Iconv',
'MBstring',
'Id3'
);
$ errors = array ();
$ php_current_version = phpversion ();
if (version_compare ($ php_min_version, $ php_current_version, '>'))
$ errors [] = "На вашем сервере запущена PHP-версия $ php_current_version, но
для этого плагина требуется хотя бы PHP $ php_min_version. Запустите обновление. ";
foreach ($ extensions as $ extension)
if (! extension_loaded ($ extension))
$ errors [] = "Пожалуйста, установите расширение расширения $, чтобы запустить этот плагин.";
return $ errors;
}
/**
* Вызовите t5_check_plugin_requirements () и отключите этот плагин, если есть ошибка.
*
* @ wp-hook admin_notices
* @return void
* /
функция t5_check_admin_notices ()
{
$ errors = t5_check_plugin_requirements ();
if (empty ($ errors))
вернуть;
//Отключить уведомление «Plugin activated».
unset ($ _GET ['activate']);
//имя этого плагина
$ name = get_file_data (__FILE__, array ('Plugin Name'), 'plugin');
Е (
'<div class = "error"> <p>% 1 $ s </p>
& Lt; р > & Lt; & я GT;% 2 $ s & л; /& я GT; был дезактивирован. </div> ',
join ('<p> <p>', $ errors),
$ Имя [0]
);
deactivate_plugins (plugin_basename (__FILE__));
}
Тест с проверкой на PHP 5.5: