Удаление, активация, деактивация плагина: типичные операции

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

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

Очистить ли мои записи опций?

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

Понравился вопрос? Нужен ответ? Поддержите проект
WPAsk
Ответов: 1
  1. kaiser

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

    • удаление
    • деактивация
    • активация

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

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

    (A) Плагин с обычными функциями

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

    <?php
    defined( 'ABSPATH' ) OR exit;
    /**
     * Plugin Name: (WCM) Activate/Deactivate/Uninstall - Functions
     * Description: Пример плагина для отображения обратных вызовов активации/деактивации/удаления для обычных функций.
     */
    
    function WCM_Setup_Demo_on_activation()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
        check_admin_referer( "activate-plugin_{$plugin}" );
    
        # Раскомментируйте следующую строку, чтобы увидеть функцию в действии
        # exit( var_dump( $_GET ) );
    }
    
    function WCM_Setup_Demo_on_deactivation()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
        check_admin_referer( "deactivate-plugin_{$plugin}" );
    
        # Раскомментируйте следующую строку, чтобы увидеть функцию в действии
        # exit( var_dump( $_GET ) );
    }
    
    function WCM_Setup_Demo_on_uninstall()
    {
        if ( ! current_user_can( 'activate_plugins' ) )
            return;
        check_admin_referer( 'bulk-plugins' );
    
        // Важное замечание: Проверьте, зарегистрирован ли файл во время удаления из системы.
        if ( __FILE__ != WP_UNINSTALL_PLUGIN )
            return;
    
          # Раскомментируйте следующую строку, чтобы увидеть функцию в действии
        # 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' );
    

    (Б) Архитектура на основе классов/ООП

    Это самый распространенный пример современных плагинов.

    <?php
    defined( 'ABSPATH' ) OR exit;
    /**
     * Plugin Name: (WCM) Activate/Deactivate/Uninstall - CLASS
     * Description: Пример плагина для отображения обратных вызовов активации/деактивации/удаления для классов/объектов.
     */
    
    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__, array( 'WCM_Setup_Demo_Class', 'on_uninstall' ) );
    
    add_action( 'plugins_loaded', array( 'WCM_Setup_Demo_Class', 'init' ) );
    class WCM_Setup_Demo_Class
    {
        protected static $instance;
    
        public static function init()
        {
            is_null( self::$instance ) AND self::$instance = new self;
            return self::$instance;
        }
    
        public static function on_activation()
        {
            if ( ! current_user_can( 'activate_plugins' ) )
                return;
            $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
            check_admin_referer( "activate-plugin_{$plugin}" );
    
            # Раскомментируйте следующую строку, чтобы увидеть функцию в действии
            # exit( var_dump( $_GET ) );
        }
    
        public static function on_deactivation()
        {
            if ( ! current_user_can( 'activate_plugins' ) )
                return;
            $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
            check_admin_referer( "deactivate-plugin_{$plugin}" );
    
            # Раскомментируйте следующую строку, чтобы увидеть функцию в действии
            # exit( var_dump( $_GET ) );
        }
    
        public static function on_uninstall()
        {
            if ( ! current_user_can( 'activate_plugins' ) )
                return;
            check_admin_referer( 'bulk-plugins' );
    
            if ( __FILE__ != WP_UNINSTALL_PLUGIN )
                return;
    
            # Раскомментируйте следующую строку, чтобы увидеть функцию в действии
            # exit( var_dump( $_GET ) );
        }
    
        public function __construct()
        {
            # активация плагина
        }
    }
    

    (C) Архитектура на основе классов / ООП с внешним объектом настройки

    В этом сценарии предполагается, что вы получили основной файл плагина и второй файл с именем setup.php в подкаталоге плагина с именем inc: ~/wp-content/plugins/your_plugin/inc/setup.php . Это также будет работать, когда папка плагина находится за пределами структуры папок WP по умолчанию, а также когда каталог содержимого переименовывается или когда ваш установочный файл назван по-другому. Только папка inc должна иметь такое же имя & amp; расположение относительно корневого каталога плагинов.

    Примечание. Вы можете просто взять три функции register_*_hook()* и классы и вставить их в свой плагин.

    Основной файл плагина:

    <?php
    defined( 'ABSPATH' ) OR exit;
    /**
     * Plugin Name: (WCM) Activate/Deactivate/Uninstall - FILE/CLASS
     * Description: Пример плагина
     */
    
    
    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' ) );
    class WCM_Setup_Demo_File
    {
        protected static $instance;
    
        public static function init()
        {
            is_null( self::$instance ) AND self::$instance = new self;
            return self::$instance;
        }
    
        public function __construct()
        {
            add_action( current_filter(), array( $this, 'load_files' ), 30 );
        }
    
        public function load_files()
        {
            foreach ( glob( plugin_dir_path( __FILE__ ).'inc/*.php' ) as $file )
                include_once $file;
        }
    }
    

    Файл-установщик:

    <?php
    defined( 'ABSPATH' ) OR exit;
    
    class WCM_Setup_Demo_File_Inc
    {
        public static function on_activation()
        {
            if ( ! current_user_can( 'activate_plugins' ) )
                return;
            $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
            check_admin_referer( "activate-plugin_{$plugin}" );
    
            # Раскомментируйте следующую строку, чтобы увидеть функцию в действии
            # exit( var_dump( $_GET ) );
        }
    
        public static function on_deactivation()
        {
            if ( ! current_user_can( 'activate_plugins' ) )
                return;
            $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';
            check_admin_referer( "deactivate-plugin_{$plugin}" );
    
            # Раскомментируйте следующую строку, чтобы увидеть функцию в действии
            # exit( var_dump( $_GET ) );
        }
    
        public static function on_uninstall()
        {
            if ( ! current_user_can( 'activate_plugins' ) )
                return;
            check_admin_referer( 'bulk-plugins' );
    
            if ( __FILE__ != WP_UNINSTALL_PLUGIN )
                return;
    
            # Раскомментируйте следующую строку, чтобы увидеть функцию в действии
            # exit( var_dump( $_GET ) );
        }
    }
    

    (2) Обновление плагинов

    Если вы пишете плагин, который имеет свою собственную таблицу или параметры БД, могут быть сценарии, в которых вам нужно что-то изменить или обновить.

    К сожалению, пока нет возможности запустить что-либо при установке плагина/темы или обновлении/обновлении. Рад, что есть обходной путь: подключите пользовательскую функцию к пользовательской опции.

    function prefix_upgrade_plugin() 
    {
        $v = 'plugin_db_version';
        $update_option = null;
       
        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' );
    
Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: