我决定给我的插件命名名称,我把它都做好了,除了在我的主插件文件中。
在调用插件的init方法之前,我在该插件中添加了两个操作。
<?php
namespace myPlugin;
add_action( \'admin_init\', \'add_activation_notice\' );
function add_activation_notice() {
add_action( \'admin_notices\', \'activation_notice\' );
}
function activation_notice() {
echo \'Notice!\';
}
但这会带来错误
Uncaught Error: 未定义常量“myPlugin\\myPlugin\\add\\u activation\\u notice”
我对命名空间比较陌生,所以我不知道为什么会发生这种情况。
这两个功能add_activation_notice
和activation_notice
都在myPlugin
命名空间。我在类内找到的大多数代码都是在线引用方法,但我需要这些方法在类外,这样才能有插件激活通知。
编辑:
当我尝试
add_action( \'admin_init\', \\add_activation_notice() );
我明白了
Fatal error: 未捕获错误:调用未定义函数add\\u activation\\u notice()
最合适的回答,由SO网友:ssnepenthe 整理而成
在走得太远之前,我建议你熟悉PHP name resolution rules.
回答您的实际问题-
当您为函数命名名称空间时,这些函数的完全限定名包括名称空间。
在您的示例中,您定义了两个函数:\\myPlugin\\add_activation_notice
和\\myPlugin\\activation_notice
.
从中调用其中一个时myPlugin
命名空间中,可以使用非限定名称(即。activation_notice()
) 但在myPlugin
命名空间必须遵循上面链接的名称解析规则。
假使add_action()
- 而这是从你的myPlugin
命名空间中,传递的不是实际的函数,而是作为字符串传递的函数名。WordPress稍后尝试从全局命名空间调用该函数。
解决问题的方法应该包括myPlugin
传递给的函数名中的命名空间add_action
(请特别注意转义的反斜杠):
add_action( \'admin_init\', \'myPlugin\\\\add_activation_notice\' );
add_action( \'admin_notice\', \'myPlugin\\\\activation_notice\' );
我首选的方法是将
__NAMESPACE__
magic constant 如果您决定更改名称空间,这会稍微简化一些事情:
add_action( \'admin_init\', __NAMESPACE__ . \'\\\\add_activation_notice\' );
add_action( \'admin_notice\', __NAMESPACE__ . \'\\\\activation_notice\' );
SO网友:Frank P. Walentynowicz
最简单的方法是将代码放在花括号中:
namespace myPlugin {
add_action( \'admin_init\', __NAMESPACE__ . \'\\\\add_activation_notice\' );
function add_activation_notice() {
add_action( \'admin_notice\', __NAMESPACE__ . \'\\\\activation_notice\' );
}
function activation_notice() {
echo \'Notice!\';
}
}
否则,您的操作将查找
activation_notice
全局命名空间中的函数。
更新没有admin_notice
钩使用admin_notices
相反尝试:
namespace myPlugin {
add_action( \'admin_init\', __NAMESPACE__ . \'\\\\add_activation_notice\');
function add_activation_notice() {
add_action( \'admin_notices\', __NAMESPACE__ . \'\\\\activation_notice\' );
}
function activation_notice() {
?>
<div class="notice notice-info is-dismissible">
<p><?php echo \'Done!\'; ?></p>
</div>
<?php
}
}