停用另一个插件时停用插件

时间:2011-09-06 作者:Peter Gibbons

想知道是否有可能在另一个插件的停用代码中停用一个插件?

我有一个小部件,我正在通过自己的插件添加,如果“主”插件没有激活,它将无法运行。。。

2 个回复
最合适的回答,由SO网友:onetrickpony 整理而成

register a deactivation hook 在第一个插件中,在这个钩子中使用deactivate_plugins() 作用

SO网友:Stephen Harris

Note: 写完这篇文章后,我提交了一张trac罚单,结果被告知this one already existed.

@OneTrickPony\'我的回答不起作用,在检查来源后(特别是deactivate_plugins()) 我找到了原因:

假设B依赖于A,而A被用户停用。WordPress呼叫deactivate_plugins(A).

此函数执行以下操作:

获取所有当前活动插件。]执行一些检查(例如插件A是否实际处于活动状态?)

  • 从该数组中删除一个
  • 激发挂钩deactivate_A (我们使用register_deactivation_hook)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);
       }
    

  • 结束

    相关推荐

    Switching Code plugins

    我目前正在使用“Wordpress代码片段”为插入到帖子中的代码添加功能。这个插件的工作方式是将代码添加到设置中的插件库中,然后执行类似于[代码:1]的操作(我记不清确切的语法了)我真的不太喜欢它的风格,所以我希望使用谷歌的美化。停用此插件会有什么影响?我会丢失所有的代码片段吗?我是否需要浏览每一篇文章并编辑所有的代码片段(即[代码:1])?