优先级与 remove_action 为什么删不掉

作者: admin 分类: wordpress主题制作教程 发布时间: 2026-11-06 18:36

一个“写了没用”的代码

caogenbj 的 functions.php 里,原来有这几行:

remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'wp_shortlink_wp_head' );
remove_action( 'wp_head', 'feed_links' );
remove_action( 'wp_head', 'feed_links_extra' );

前三行生效了,后两行从来没生效过。页面 head 里还是能看到 RSS 的 link。

为什么?因为优先级。

优先级是“柜子号”

WordPress 把所有挂在同一个钩子上的函数,存在一个数组里,优先级就是这个数组的键:

$wp_filter['wp_head'] = [
    2  => [ 'feed_links' => ... ],
    3  => [ 'feed_links_extra' => ... ],
    10 => [ 'rsd_link' => ..., 'wlwmanifest_link' => ..., 'wp_shortlink_wp_head' => ... ],
];

remove_action( 'wp_head', 'feed_links' ) 不写第三个参数时,默认按 10 号去找——但 feed_links 存在 2 号柜子里,所以找不到,删不掉。

正确写法是精确报号:

remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'feed_links_extra', 3 );

为什么写成 1 也不行

有人会想:“那我把数字写小一点,1 是不是更靠前、更容易删?”

不行。1 号柜子是空的,你去 1 号柜找,还是找不到。

remove_action 的第三个参数不是“执行时机”,是“查找键”,必须跟当初 add_action 时用的数字一模一样。

一个类比

add_action 是往储物柜存东西,remove_action 是从储物柜取东西。

  • 存的时候报 2 号柜,取的时候必须报 2 号;
  • 报 1 号,柜子是空的,你什么也拿不到;
  • 报 10 号(默认),柜子里是别的东西,也拿不到你要的。

报的号码小,不代表“更快拿到”,只代表“你去错了柜子”。

怎么查一个函数的优先级

权威来源是 WordPress 源码,文件 wp-includes/default-filters.php,里面全是注册:

add_action( 'wp_head', 'feed_links', 2 );
add_action( 'wp_head', 'feed_links_extra', 3 );
add_action( 'wp_head', 'print_emoji_detection_script', 7 );
add_action( 'wp_head', 'rsd_link' );          // 不写就是 10

看数字就行。找不到源码的话,也可以用一段“挨个试”的代码:

foreach ( range( 1, 100 ) as $p ) {
    remove_action( 'wp_head', 'feed_links', $p );
}

1 到 100 号挨个报一遍,总有一个能开。代价是几十次空查找,可忽略。但能查源码就别这么干,看着像在猜。

一个连带发现

那为什么 feed_links(主 RSS)的 link 没出现在页面上?

不是因为删成功了,而是因为 caogenbj 主题没有声明 add_theme_support('automatic-feed-links'),feed_links() 一开头就直接返回了。

巧合掩盖了 bug。这在 WordPress 里很常见——你以为“写对了”,其实是“没触发”。

小结

一句话记住:remove_action 的第三个参数必须跟 add_action 时的优先级完全一致;不写就是 10,写 1 也没用。

下一篇讲:主题功能和插件功能,界线在哪。

本系列导航

相关文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Powered by 草根站长笔记 © 2015-2026 草根站长笔记 Inc.版权所有,禁止转载