本文约 4,367 字,预计阅读 11 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:打开源码,head 里一半是你不需要的
随便打开一个 WordPress 页面的源代码,<head> 里除了必要的标题与样式,通常还挤着:一段 emoji 检测脚本(几十行内联 JS)、emoji 的 CSS、s.w.org 的 DNS 预取、RSD 链接、Windows Live Writer 的 manifest、<meta name="generator" content="WordPress 6.x">、短链接、相邻文章的 rel 链接、REST API 的发现链接、oEmbed 的发现链接、各种 RSS feed 链接。
这些东西单个都不大,但加起来意味着额外的请求、更大的 HTML 体积,以及把站点版本号公开出去。对性能敏感或注重信息收敛的站点,一段十几行的代码就能全部清掉。
原理分析:这些输出是谁加的
WordPress 核心在 wp-includes/default-filters.php 里给 wp_head 挂了一系列默认动作,主题调用 wp_head() 时全部触发:
| 输出内容 | 挂载的函数 | 是否建议移除 |
|---|---|---|
| Emoji 检测脚本 | print_emoji_detection_script(优先级 7) |
是(若不用 emoji) |
| Emoji 样式 | print_emoji_styles(挂在 wp_print_styles) |
是 |
| Emoji DNS 预取 | wp_resource_hints 里的 s.w.org |
是 |
| RSD 链接 | rsd_link |
是 |
| WLW manifest | wlwmanifest_link |
是 |
| 版本号 meta | wp_generator |
视安全策略 |
| 短链接 | wp_shortlink_wp_head |
是 |
| 相邻文章 rel | adjacent_posts_rel_link_wp_head |
是 |
| REST 发现链接 | rest_output_link_wp_head |
谨慎(REST 被用到时保留) |
| oEmbed 发现链接 | wp_oembed_add_discovery_links |
是(若不需要嵌入) |
| 分类/评论 feed | feed_links_extra |
视站点需求 |
移除方式统一是 remove_action() / remove_filter(),且优先级必须与核心挂载时一致(emoji 脚本是 7,feed_links 是 2),否则无效。另外这些移除必须在核心挂载之后执行,放在子主题 functions.php 的 init 钩子里最稳妥。
需要注意:emoji 相关还有几个过滤器(the_content_feed、comment_text_rss、wp_mail),只移除 wp_head 的动作并不能完全关掉服务端转换,要一并处理。
保姆级实操
- 先看清楚当前输出了什么:打开页面源码查看
<head>,或用 curl 抓取后逐项比对,别凭记忆写移除清单。 - 禁用 emoji:移除
wp_head与admin_print_scripts上的检测脚本、wp_print_styles上的样式,以及三个内容过滤器。 - 移除
s.w.org的 DNS 预取:用wp_resource_hints过滤掉该域名。 - 移除 RSD、WLW、短链接、相邻文章链接:逐个
remove_action,注意feed_links的优先级是 2。 - 决定是否移除版本号:隐藏
wp_generator不能直接提升安全,但能减少信息暴露;注意它并不能替代真正的更新维护。 - 谨慎处理 REST 与 oEmbed:如果站点用了区块编辑器、部分插件或需要被外部嵌入,保留 REST 与 oEmbed;纯展示型站点可移除。
- 验证:清缓存后重新查看源码,确认目标输出已消失,且页面功能(尤其是编辑器与 RSS)仍正常。
<?php
// 子主题 functions.php:一次性关闭 emoji 相关输出
add_action( 'init', 'mimangfei_disable_emojis' );
function mimangfei_disable_emojis() {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
// 编辑器里的 emoji 插件
add_filter( 'tiny_mce_plugins', function ( $plugins ) {
return is_array( $plugins ) ? array_diff( $plugins, array( 'wpemoji' ) ) : array();
} );
// 移除 emoji CDN 的 DNS 预取(s.w.org)
add_filter( 'wp_resource_hints', 'mimangfei_remove_emoji_dns_prefetch', 10, 2 );
}
function mimangfei_remove_emoji_dns_prefetch( $hints, $relation_type ) {
if ( 'dns-prefetch' === $relation_type ) {
$hints = array_filter( $hints, function ( $hint ) {
return false === strpos( $hint, 's.w.org' );
} );
}
return $hints;
}
<?php
// 清理 wp_head 里的其他冗余输出
add_action( 'init', 'mimangfei_cleanup_head' );
function mimangfei_cleanup_head() {
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'wp_shortlink_wp_head' );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'rest_output_link_wp_head' );
// 注意 feed_links 的优先级是 2,写错会移除失败
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'feed_links_extra', 3 );
}
# 清理前后对比:抓取源码,检查这些关键字是否还在
curl -s https://example.com/ \
| grep -o -E "wlwmanifest|rsd_link|name=\"generator\"|wp-emoji-release|s\.w\.org|application/json\+oembed" \
| sort | uniq -c
# 只看 head 部分(前 60 行)便于人工核对
curl -s https://example.com/ | sed -n '1,60p'
常见踩坑
remove_action的优先级写错(emoji 是 7、feed_links 是 2),代码看着对却不生效。- 只移除了 head 里的脚本,忘了
wp_mail等过滤器,邮件里仍在做 emoji 转换。 - 移除
rest_output_link_wp_head后,区块编辑器或依赖 REST 的插件报错。 - 移除 feed 链接后,RSS 订阅地址失效,老读者断流。
- 案例:某站一次把 REST 与 oEmbed 全部移除,两天后发现文章被第三方平台嵌入时无法生成摘要卡片,同时站内一个基于 REST 的搜索功能报错。最后只保留 emoji、RSD、WLW、短链接的移除,把 REST 与 oEmbed 加回白名单。
- 把这段代码放进父主题
functions.php,主题升级后丢失(应放子主题或功能插件)。 - 改完没清缓存,源码里依然看到旧输出,误以为代码没生效。
总结
清理的思路是”先列清单再移除”,不要照抄别人的片段一刀切。判断标准是”清理后页面功能无损失:编辑器正常、RSS 可用、嵌入正常、无控制台报错”。行动清单:① 先抓源码列清单;② emoji 要连带过滤器一起关;③ 注意各钩子的优先级;④ REST 与 oEmbed 按需保留;⑤ 代码放子主题或功能插件;⑥ 改完清缓存验证。延伸阅读 lumen-mimangfei 主题性能优化、主题字体本地化 与 WordPress 子主题制作。
