当我希望过滤器或操作挂钩覆盖所有其他过滤器时,我将其分配为的优先级999
。但是,最近我看到有些人使用极限值作为优先级,例如20000
,甚至99999
除了使用如此高的优先级是荒谬的事实,它们是否真的有效?挂钩优先级是否有限制?如果超过限制会怎样?使用极端优先级时是否存在性能差异?
当我希望过滤器或操作挂钩覆盖所有其他过滤器时,我将其分配为的优先级999
。但是,最近我看到有些人使用极限值作为优先级,例如20000
,甚至99999
除了使用如此高的优先级是荒谬的事实,它们是否真的有效?挂钩优先级是否有限制?如果超过限制会怎样?使用极端优先级时是否存在性能差异?
Answers:
没有限制,也没有性能损失。要了解原因,您需要了解所有挂钩如何存储在WP生态系统中。
首先,您需要了解所有挂钩的存储位置以及它们的存储方式。所有过滤器和wp_filter
动作的挂钩都存储在名为的全局变量中,是的,动作挂钩也存储在此变量中。此变量是关联的数组,其中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环境可以接受的任何值作为关联数组的键。
max( $priorities ) + 1
如果最后一个数字等于,将失败PHP_INT_MAX
。在这种情况下,您必须将值转换为字符串并添加一些内容。
$wp_filter
不断变化,“奖金”是个坏主意。它不能直接由插件使用。过去我们进行了修改(主要是出于性能方面的考虑,偶然)。
@shea-WordPress操作与您假设的相反。较高优先级的数字将不会覆盖其他优先级,并且PHP_INT_MAX的使用不是某种“极端”尝试来强制此操作/过滤器先于其他任何运行。
要将操作/过滤器置于执行顺序的最前,您需要使用优先级0。
PHP_INT_MAX恰好在另一端。当您希望您的操作/过滤器在所有其他(正常优先级)钩子完成之后运行时,将使用它。
$priority
,因此优先级挂钩的回调0
不一定在执行顺序的顶部。