高级WordPress插件激活检测

时间:2018-01-26 作者:Maxwell s.c

我正在测试插件激活检测,因为我的插件出了问题。我发现了问题,但不明白:

我试图检查插件的激活情况(其他插件和我自己的插件),但在WordPress挂钩中(init, 例如)

在第一个示例中,我将听“Hello Dolly”插件激活:

add_action(\'init\', function(){
    register_activation_hook(\'hello.php\', function(){
        echo \'Hello was activated.\';
    });
    do_action(\'wordpress_initialized\');
});

add_action(\'wordpress_initialized\', function(){
    register_activation_hook(\'hello.php\', function(){
        echo \'Hello is not allowed.\';
        die;
    });
});
我正在做的是:

收听init 钩住它,倾听hello.php 插件激活,表示已激活

  • 在init hook内部,触发一个自定义hook,表示wordpress已加载。在外部,我等待另一个自定义hook,然后收听hello激活。激活时,我阻止激活,表示不允许

    The problem: 如果我应用这段代码来监听我的插件,它将不起作用。(以下内容在内部myplugin.php)

    add_action(\'init\', function(){
        register_activation_hook(\'myplugin.php\', function(){
            echo \'myplugin was activated.\';
        });
        do_action(\'wordpress_initialized\');
    });
    
    add_action(\'wordpress_initialized\', function(){
        register_activation_hook(\'myplugin.php\', function(){
            echo \'myplugin is not allowed.\';
            die;
        });
    });
    
    这是因为,我一直等到init钩子注册激活钩子。。。如果我在任何钩子之外注册激活钩子,它就会工作。

    但还有更多。

    如果我在激活挂钩内触发一个自定义操作,那么这个操作可以是监听。

    register_activation_hook(\'myplugin.php\', function(){
        echo \'myplugin was activated.\';
        do_action(\'myplugin_activate\');
    });
    
    add_action(\'myplugin_activate\', function(){
        echo \'myplugin is not allowed.\';
        die;
    });
    
    所以有问题也有解决方案,但我不知道为什么,为什么我可以听其他插件的激活,但不能这样听我自己的?是因为激活过程?我在文档中读到了这一点,然后发生了重定向,这是如何影响工作流程的?

    ---EDIT---

    最后一个例子并不完全是一个解决方案。我需要的是在init hook中为我自己的插件添加一个监听器,如下所示:

    add_action(\'init\', function (){
        add_action(\'myplugin_activate\', function(){
            echo \'myplugin is not allowed.\';
            die;
        });
    });
    

  • 1 个回复
    最合适的回答,由SO网友:swissspidy 整理而成

    这个initplugins_loaded 在激活插件之前,挂钩已经运行。这就是为什么第一个代码不起作用,而第二个代码起作用。

    关于第三个代码:无需运行add_action(\'myplugin_activate\' … 在…内init. 并非所有的东西都需要被吸引init. 仅使用

    add_action(\'myplugin_activate\', function(){
        echo \'myplugin is not allowed.\';
        die;
    });
    
    没有任何init 东西虽然我可能不会使用die :-)

    查看Codex article on register_activation_hook() 其中有许多有价值的例子。

    结束