挂钩优先级有限制吗?

时间:2013-01-09 作者:shea

当我希望我的过滤器或动作挂钩覆盖所有其他内容时,我将为其分配优先级999. 然而,最近我看到一些人使用极端值作为优先级,例如20000, 甚至99999

除了使用如此高的优先级是荒谬的这一事实之外,它们真的会起作用吗?挂钩优先级是否有限制?如果超出限制,会发生什么情况?使用极端优先级时是否存在性能差异?

Update: @harke 暗示on Stack Overflow 数量受到以下限制PHP_INT_MAX

5 个回复
最合适的回答,由SO网友:Eugene Manuilov 整理而成

没有限制,也没有性能惩罚。要了解原因,您需要了解所有挂钩是如何存储在WP生态系统中的。

首先,您需要了解所有挂钩的存储位置以及它们是如何实现的。过滤器和操作的所有挂钩都存储在名为wp_filter, yes yes动作挂钩也存储在此变量中。此变量是关联数组,其中key是操作或过滤器的名称,value是另一个关联数组。例如,让我们看一下“init”操作,在此阶段我们将看到以下结构:

$wp_filter = array(
    \'init\' => array(...),
);
此子数组具有作为数组的数字键和值。数字键是我们的首要任务。与数字键关联的数组包含具有相同优先级的挂钩列表。所以如果我们打电话add_action( \'init\', \'wpse8170_my_first_init\', 20 ), 然后打电话add_action( \'init\', \'wpse8170_my_second_init\', 20 ) 最后打电话add_action( \'init\', \'wpse8170_my_third_init\', 10 ), 我们的示例如下所示:

$wp_filter = array(
    \'init\' => array(
        20 => array(
            \'wpse8170_my_first_init\' => array(
                \'accepted_args\' => 1, // the number of accepted arguments by your hook
                \'function\' => \'wpse8170_my_first_init\', // callback function
            ),
            \'wpse8170_my_second_init\' => array(...),
        ),
        10 => array(
            \'wpse8170_my_third_init\' => array(...),
        ),
    ),
);
现在什么时候init 操作被触发,所有挂钩将使用ksort 函数和阵列现在看起来:

    array(
        10 => array(
            \'wpse8170_my_third_init\' => array(...),
        ),
        20 => array(
            \'wpse8170_my_first_init\' => array(
                \'accepted_args\' => 1, // the number of accepted arguments by your hook
                \'function\' => \'wpse8170_my_first_init\', // callback function
            ),
            \'wpse8170_my_second_init\' => array(...),
        ),
    ),
所有钩子都将在此队列中执行:首先\'wpse8170_my_third_init\', 然后\'wpse8170_my_first_init\' 最后\'wpse8170_my_second_init\'.

因此,您可以看到没有限制和惩罚,您可以使用PHP环境可以接受的任何值作为关联数组的键。

SO网友:webaware

它是一个整数,因此在32位PHP系统上,它将被限制为-2147483648到2147483647,而在64位PHP上,它将被限制为-9223372036854775808到9223372036854775807。

编辑:没有性能损失,这是一个整数。

但是真的吗?:)

SO网友:Andy Schmidt

@shea-WordPress操作的工作方式与您假设的完全相反。更高优先级的数字将NOT 重写其他,并使用PHP_INT_MAXNOT “一些”;“极端”;尝试强制此操作/筛选器先于任何其他操作/筛选器运行。

要将操作/筛选器置于执行序列的顶部,您需要使用至少0, 或更好:PHP_INT_MIN.

PHP_INT_MAX 只是在另一端;当您希望在所有其他(正常优先级)挂钩完成后运行操作/筛选器时,可以使用它。

SO网友:Mark Kaplun

没有限制,也没有绩效处罚。通过检查代码,您甚至可以使用字符串作为优先级,尽管我不建议这样做;)

如果您的操作必须是最后一个,那么您可以通过查看全局$wp_actions[your hook] 当您的操作被调用时,如果需要,请以更高的优先级再次添加,但我看不到实际执行此类操作的原因。

SO网友:WP Themes

实际上没有限制,因为挂钩实际上存储为数组,优先级是数字索引。

但是,实际上,数组大小将受到为执行脚本分配的内存量的限制。

所以,我想设置一个大得离谱的优先级数字——它只是转换为存储挂钩函数的数组中的数字索引——应该不会使wordpress崩溃。

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴