如何知道使用Add_action()的优先级?

时间:2015-06-23 作者:j08691

我正在编写一个小插件,从后端删除非管理员用户的一些菜单项,发现我的插件没有任何作用,除非我在代码中指定了优先级:

add_action(\'admin_bar_menu\', \'remove_toolbar_items\', 999);
没有999, 代码不会删除我的remove_toolbar_items 功能强大,使用它效果很好:

function remove_toolbar_items( $wp_admin_bar ) {
    if ( !current_user_can( \'manage_options\' ) ) {
        $wp_admin_bar->remove_node(\'new-post\');
        $wp_admin_bar->remove_node(\'comments\');
    }
}
Thedocs 对于优先级参数状态:

用于指定与特定操作关联的函数的执行顺序。较小的数字对应较早的执行,具有相同优先级的函数按照它们添加到操作的顺序执行。默认值:10

但是,我没有找到任何解释您应该如何确定使用哪个优先级的内容。如何确定何时使用优先级,以及使用哪个优先级?我觉得如果我没有玩弄优先级参数,我可能已经挠了好几个小时的头了。

此外,我看到默认优先级为10,但是否存在已知的优先级值范围?

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

优先级值的范围?优先级值的范围?

一般来说,你无法先验地知道事物的优先级。所需的优先级取决于其他回调的连接方式。通常这是默认值10,但它可以介于PHP_INT_MIN (负整数仍然是整数)和PHP_INT_MAX 除了通过实验,如果可能的话(比如核心和你特别关注的任何主题或插件),通过检查源代码,没有办法确定。

SO网友:Howdy_McGee

WordPress将您的操作放入具有索引优先级的数组中。您可以通过打印(在“管理”面板中)看到这一点admin_init ) $wp_filter:

*Note*admin_init 可能无法捕获动作中添加的所有挂钩,可能会连接到更可靠的打印输出shutdown 相反

function filter_print() {
    global $wp_filter;
    print_r( $wp_filter[\'admin_bar_menu\'] );
    die();
}
add_action( \'admin_init\', \'filter_print\' );
这给了我们一个整洁的数组,看起来像这样:(简化)

Array(
    [admin_bar_menu] => Array (
        [0] => Array (
            [wp_admin_bar_my_account_menu] => Array (
                [function] => wp_admin_bar_my_account_menu
                [accepted_args] => 1
            )
            [wp_admin_bar_sidebar_toggle] => Array (
                [function] => wp_admin_bar_sidebar_toggle
                [accepted_args] => 1
            )
        )

        [4] => Array (
            [wp_admin_bar_search_menu] => Array (
                [function] => wp_admin_bar_search_menu
                [accepted_args] => 1
            )
        )

        [7] => Array (
            [wp_admin_bar_my_account_item] => Array (
                [function] => wp_admin_bar_my_account_item
                [accepted_args] => 1
            )
        )

        [10] => Array (
            [wp_admin_bar_wp_menu] => Array (
                [function] => wp_admin_bar_wp_menu
                [accepted_args] => 1
            )
        )

        [20] => ...
    )
)
0、4、7、10等是操作的优先级,当添加新操作时,它的默认值为10,类似于上例中的索引0,它们只是堆叠到数组的同一索引中。考虑到此特定操作中添加了许多挂钩,您可能希望在最后或在运行特定操作(如菜单)之后添加这些挂钩。两个优先事项中的一个也可以同样有效地发挥作用:81201.

在大多数情况下,默认优先级10就足够了。其他时候,您希望在另一个钩子之后直接添加钩子(可能会使其无效或删除特定项),在这种情况下,您可以使用global $wp_filter; 找出它需要去哪里。

SO网友:Mohammed Asif

嗯,有一种方法可以找到行动的优先顺序。

我们可以使用以下代码has_action( $tag, $function_to_check ) 它可以选择返回指定函数在该钩子上的优先级。

参考号:https://codex.wordpress.org/Function_Reference/has_action

SO网友:harrrrrrry

如果有人正在查找WordPress操作优先级/参考列表,完整的挂钩链接如下:

https://codex.wordpress.org/Plugin_API/Action_Reference/

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $