Note: 写完这篇文章后,我提交了一张trac罚单,结果被告知this one already existed.
@OneTrickPony\'我的回答不起作用,在检查来源后(特别是deactivate_plugins()
) 我找到了原因:
假设B依赖于A,而A被用户停用。WordPress呼叫deactivate_plugins(A)
.
此函数执行以下操作:
获取所有当前活动插件。]执行一些检查(例如插件A是否实际处于活动状态?)
从该数组中删除一个激发挂钩deactivate_A
(我们使用register_deactivation_hook
)将数组更新到数据库现在,在步骤4中,我们调用deactivate_plugins(B)
停用。同样的过程再次发生,并且完成了——这很好。但一旦完成,我们将继续执行步骤5(在原始deactivate_plugins()
呼叫A)。该数组将更新到数据库中,但该数组是在步骤1中检索到的最原始的数组,并且只有一个已删除的数组。特别是我们在B仍然处于活动状态时检索到它,因此它包含B。Note: 您的停用回调被触发,即使WordPress下次加载页面时仍认为其处于活动状态。
解决方案是使用稍后的挂钩(在选项更新之后)。为此,我们可以利用update_option_{$option}
挂钩:
//This goes inside Plugin A.
//When A is deactivated. Deactivate B.
register_deactivation_hook(__FILE__,\'my_plugin_A_deactivate\');
function my_plugin_A_deactivate(){
$dependent = \'B/B.php\';
if( is_plugin_active($dependent) ){
add_action(\'update_option_active_plugins\', \'my_deactivate_dependent_B\');
}
}
function my_deactivate_dependent_B(){
$dependent = \'B/B.php\';
deactivate_plugins($dependent);
}