我不明白为什么我需要较低的优先级来删除优先级较高的操作才能使其工作

时间:2018-09-07 作者:Aerendir

section about Priority of the WordPress documentation 声明如下:

优先级为11的函数将在优先级为10的函数之后运行;优先级为9的函数将在优先级为10的函数之前运行。任何正整数都是可接受的值,默认值为10。

一切都清楚了,没什么好说的。

但是,我在删除已添加的操作时遇到问题(问题是this).

要添加操作,使用的代码如下:

add_action( \'genesis_entry_header\', \'shq_genestrap_post_meta_categories\', 9 );
因此,删除它的预期代码应该是:

// Expected that a priority of 10 remove the added action
// This DOESN\'T WORK
add_action(\'genesis_entry_header\', \'my_remove\', 10);

function my_remove() {
    remove_action( \'genesis_entry_header\', \'shq_genestrap_post_meta_categories\', 9 );
}
但有了这一优先权,行动不会被取消。

相反,为了让它发挥作用,我必须优先使用8:

// A priority of 8, instead, unexpectedly works:
add_action(\'genesis_entry_header\', \'my_remove\', 10);
...
我不明白的是它为什么会起作用:如果我使用8 我要删除的操作尚未添加,因为它的优先级为9: 相反,优先考虑8 作品

为什么?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

你在某种程度上误解了优先级是如何工作的。优先级决定了给定挂钩函数运行的顺序,例如。genesis_entry_header. 优先级不是全局的。

从挂钩中删除操作时,需要使用与该操作最初挂钩时相同的优先级。你在做什么。

您正在添加的操作的优先级为9:

add_action( \'genesis_entry_header\', \'shq_genestrap_post_meta_categories\', 9 );
使用的匹配优先级9 要删除它,请执行以下操作:

remove_action( \'genesis_entry_header\', \'shq_genestrap_post_meta_categories\', 9 );
您的实际问题是,您无法在添加操作之前或已运行操作之后删除该操作。

让我们看看在函数之外运行的两个动作挂钩:

add_action(\'genesis_entry_header\', \'my_remove\', 10);
add_action( \'genesis_entry_header\', \'shq_genestrap_post_meta_categories\', 9 );
接下来发生的是《创世纪》将触发genesis_entry_header 在其代码或模板中的某个地方挂接以下内容:

do_action( \'genesis_entry_header\' );
当这种情况发生时,您的两个函数将按优先级顺序运行:

shq_genestrap_post_meta_categories(); // Priority 9
my_remove(); // Priority 10
您正试图解开挂钩shq_genestrap_post_meta_categories() 在…内my_remove(), 但这行不通,因为这已经发生了。

将优先级更改为8时,会发生以下情况:

my_remove() // Priority 8
// Priority 9, nothing is hooked anymore.
my_remove() 之前正在运行shq_genestrap_post_meta_categories(), 所以my_remove() 将能够成功解除挂钩。

因此,关键在于:要删除一个动作remove_action() 需要运行函数:

添加要删除的操作后add_action().无论是谁提出了您的解决方案,都会告诉您这样挂接函数的原因。。。

add_action(\'genesis_entry_header\', \'my_remove\', 8);
function my_remove() {
    remove_action( \'genesis_entry_header\', \'shq_genestrap_post_meta_categories\', 9 );
}
。。。是因为genesis_entry_header 优先考虑8 是要取消挂钩的功能运行之前的最后可能时刻。这意味着您几乎可以肯定我提到的两个条件已经满足:操作已经添加,但尚未运行。

很可能您实际上可以更早地删除该操作,但如果不知道所有代码的加载顺序,就不可能准确地说出具体的时间,而第三方观察员不太可能知道。

结束