我正在测试插件激活检测,因为我的插件出了问题。我发现了问题,但不明白:
我试图检查插件的激活情况(其他插件和我自己的插件),但在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;
});
});
最合适的回答,由SO网友:swissspidy 整理而成
这个init
和plugins_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()
其中有许多有价值的例子。