搜索全站
主题 11 分钟阅读

关闭 emoji 与多余头部输出优化主题:减少无谓请求的代码片段

wp_head 里塞了一堆用不上的脚本和链接?本文给出禁用 emoji、移除 RSD/wlwmanifest/版本号/oEmbed 等冗余输出的完整片段与验证方法。

U
UFO_PF 2025-05-06 · 阅读 11 分钟
关闭 主题
阅读提示
本文约 4,367 字,预计阅读 11 分钟。文中命令与配置均经过实测,可直接参考执行。

随便打开一个 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 的动作并不能完全关掉服务端转换,要一并处理。

保姆级实操

  1. 先看清楚当前输出了什么:打开页面源码查看 <head>,或用 curl 抓取后逐项比对,别凭记忆写移除清单。
  2. 禁用 emoji:移除 wp_head 与 admin_print_scripts 上的检测脚本、wp_print_styles 上的样式,以及三个内容过滤器。
  3. 移除 s.w.org 的 DNS 预取:用 wp_resource_hints 过滤掉该域名。
  4. 移除 RSD、WLW、短链接、相邻文章链接:逐个 remove_action,注意 feed_links 的优先级是 2。
  5. 决定是否移除版本号:隐藏 wp_generator 不能直接提升安全,但能减少信息暴露;注意它并不能替代真正的更新维护。
  6. 谨慎处理 REST 与 oEmbed:如果站点用了区块编辑器、部分插件或需要被外部嵌入,保留 REST 与 oEmbed;纯展示型站点可移除。
  7. 验证:清缓存后重新查看源码,确认目标输出已消失,且页面功能(尤其是编辑器与 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 子主题制作。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。