命名空间中的Add_action不起作用

时间:2017-11-03 作者:dingo_d

我决定给我的插件命名名称,我把它都做好了,除了在我的主插件文件中。

在调用插件的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_noticeactivation_notice 都在myPlugin 命名空间。我在类内找到的大多数代码都是在线引用方法,但我需要这些方法在类外,这样才能有插件激活通知。

编辑:

当我尝试

add_action( \'admin_init\', \\add_activation_notice() );
我明白了

Fatal error: 未捕获错误:调用未定义函数add\\u activation\\u notice()

2 个回复
最合适的回答,由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
    }
}

结束