Closed sergey-s-betke closed 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 "Плагин активирован".
Исходя из указанной выше логики и следует действовать при планировании Фреймворка.
В общем и целом - в обработчике activation
нельзя даже планировать другие события.
Поэтому проверку требований программной совместимости необходимо выполнять при admin_init
, так и при активации.
Правильным вижу следующее решение: при успешной активации необходимо создавать не autoload
опцию, а при admin_init
её проверять. Если её нет - деактивировать плагин.
А в опцию писать сообщение об ошибке, возникшей при активации. Ну или вообще - сообщение с указанием его типа. И деактивировать - только при ошибке активации.
Но следует предусмотреть и более простую версию - для плагинов, не требующих активации.
Достаточно неочевидной оказалась реализация деактивация плагина при его активации.