如何知道与add_action()一起使用的优先级?


12

我正在编写一个小插件,以从后端删除非管理员用户的某些菜单项,并发现除非我在代码中指定了优先级,否则插件不会执行任何操作:

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');
    }
}

优先级参数状态的文档

用于指定执行与特定操作关联的功能的顺序。较小的数字表示较早的执行,并且具有相同优先级的功能按照将它们添加到操作中的顺序执行。默认值:10

但是,我找不到任何可以解释您如何确定要使用的优先级的内容。您如何确定何时使用优先级以及使用什么优先级?如果我没有玩弄priority参数的话,我觉得我可能已经花了好几个小时了。

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

Answers:


6

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

通常来说,您无法先验地知道某个事物具有什么优先级。所需的优先级取决于挂接其他回调的方式。通常这是默认值10,但它可以介于两者之间PHP_INT_MIN(负整数仍然是整数),PHP_INT_MAX没有办法确定,除非通过实验,并且在可能的情况下( (例如Core和您特别关注的任何主题或插件),方法是检查源代码。


1
谢谢。好像核心应该具有一些内置实用程序来为您提供此信息。
j08691 2015年

这不是正确的信息,也无法回答。穆罕默德·阿西夫(Mohammed Asif)回答正确。has_filter('init','some_hook')允许知道优先级动作是什么。
ЮраКосяк

5

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

* 注意 *正如@s_ha_dum在下面的注释中指出的那样,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,它们只是堆叠到数组的相同索引中。考虑到在此特定操作中添加了许多钩子,因此您想在运行特定操作(例如menu)的最后或最后添加。两个优先事项之一也可以同样有效地工作:81201

在大多数情况下,默认优先级10足够了。其他时候,您想直接添加另一个钩子(以取消其用途或删除特定项目),在这种情况下,您可以使用global $wp_filter;来确定钩子的位置。


我考虑过这一点,但它只会显示之前或之后挂接的内容,admin_init 并且仅显示当前安装中挂接的内容。它并没有说明尚未卸载的插件或主题可能会做什么。还是+1。
s_ha_dum

@s_ha_dum很好,我想您也可以使用类似的方法admin_footer吗?还是那是同样的问题?
Howdy_McGee

1
shutdown钩子将是你最好的选择,但仅用于安装的代码,即使这样,事情可以有条件地钩住,因此可能错过一些无妨。
s_ha_dum


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.