Удаление, активация, деактивация плагина: типичные функции и amp; как

Я делаю плагин wordpress. Каковы типичные вещи, которые я должен включить в функцию удаления?

Например, следует ли удалить все таблицы, созданные в функции установки?

Очистить ли мои записи параметров?

Что-нибудь еще?

87 голосов | спросил redconservatory 15 AM00000030000003631 2011, 03:21:36

2 ответа


135

Существует три разных крючка. Они запускаются в следующих случаях:

  • Удалить
  • Дезактивация
  • Активация

Как безопасно запускать функции во время сценариев

Ниже показаны способы 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');

Источник

Эта функция обновления является не очень приятным /хорошо написанным примером, но, как сказано: Это пример, и этот метод работает хорошо. Улучшит это с последующим обновлением.

ответил kaiser 15 PM000000100000000531 2011, 22:18:05
15

Чтобы протестировать текущую систему для требуемых функций, таких как 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:

введите описание изображения здесь

ответил fuxia 9 PMpTue, 09 Apr 2013 22:45:04 +040045Tuesday 2013, 22:45:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132