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 号柜找,还是找不到。
remove_action 的第三个参数不是“执行时机”,是“查找键”,必须跟当初 add_action 时用的数字一模一样。
add_action 是往储物柜存东西,remove_action 是从储物柜取东西。
报的号码小,不代表“更快拿到”,只代表“你去错了柜子”。
权威来源是 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 也没用。
下一篇讲:主题功能和插件功能,界线在哪。