IT-Service-WordPress / WPF

Шаблон плагина для WordPress (CMS)
GNU General Public License v2.0
0 stars 0 forks source link

Деактивация плагина при активации, реализация #2

Closed sergey-s-betke closed 10 years ago

sergey-s-betke commented 10 years ago

Достаточно неочевидной оказалась реализация деактивация плагина при его активации.

sergey-s-betke commented 10 years ago

Работающий код:

function test2_on_activate() {
}

register_activation_hook( __FILE__, 'test2_on_activate' );

function deactivate_test2() {
    new WP_admin_notice( array( 'test1', 'test2' ), 'error' );
    deactivate_plugins( plugin_basename( __FILE__ ) );
    if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] ); 
}

add_action( 'admin_init', 'deactivate_test2' );

Суть вот в чём: активация выполняется не в глобальном контексте, поэтому глобальные переменные недоступны, посему и deactivate_plugins не работает. Для указанной функции всё доступно и работает в admin_init. А строка

    if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] ); 

просто позволяет исключить лишний admin notice "Плагин активирован".

Исходя из указанной выше логики и следует действовать при планировании Фреймворка.

sergey-s-betke commented 10 years ago

В общем и целом - в обработчике activation нельзя даже планировать другие события.

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

Правильным вижу следующее решение: при успешной активации необходимо создавать не autoload опцию, а при admin_init её проверять. Если её нет - деактивировать плагин.

А в опцию писать сообщение об ошибке, возникшей при активации. Ну или вообще - сообщение с указанием его типа. И деактивировать - только при ошибке активации.

sergey-s-betke commented 10 years ago

Но следует предусмотреть и более простую версию - для плагинов, не требующих активации.