搜索全站
Google SEO 4 分钟阅读

避免 WordPress 结构化数据重复输出:插件与主题冲突去重

当页面同时被插件和主题输出结构化数据时,教你用 remove_action、优先级调整与输出前过滤三种方式去重,消除 GSC 重复字段警告,稳住富媒体展示。

U
UFO_PF 2016-06-21 · 阅读 4 分钟
避免 GOOGLE SEO
阅读提示
本文约 1,437 字,预计阅读 4 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:源码里两段一模一样的 Organization

打开任意文章源码,搜索 ld+json,跳出两段 Organization 或 Article——一段来自 SEO 插件,一段来自主题。虽不一定报错,但 Google 可能只认其中一段,且浪费抓取预算。去重的本质是”只留一个数据源”。

原理分析:输出时机决定去重手段

WordPress 所有头部输出都挂在 wp_head 动作上,靠优先级(priority)排序。插件常用 10,主题可能用 1 或 20。去重有三层思路:从源头 remove_action 关掉一方;用 wp_head 优先级错开但无法阻止重复;最稳的是在输出前用 ob_start 缓冲抓到内容并剔除重复块。

保姆级实操

方法一,关掉主题侧(最常用):

// 子主题 functions.php,先打印所有 wp_head 钩子找主题函数名
add_action( 'wp_head', function () {
    global $wp_filter;
    error_log( print_r( $wp_filter['wp_head']->callbacks, true ) );
}, 999 );

// 找到后移除,例如主题函数叫 theme_schema_json
remove_action( 'wp_head', 'theme_schema_json', 10 );

方法二,仅保留插件,禁用主题”结构化数据”开关(多数现代主题在自定义器或 Site Editor 里有此选项)。
方法三,输出前过滤兜底:

add_action( 'template_redirect', function () {
    ob_start( function ( $html ) {
        return preg_replace( '/<script type="application\/ld\+json"[^>]*>.*?<\/script>\s*(?=<script type="application\/ld\+json")/s', '', $html, 1 );
    } );
} );

常见踩坑

  1. remove_action 的优先级写错,函数没被移除,因为主题挂的是 20 不是 10。
  2. 在父主题改,一更新主题改动就被覆盖,必须放子主题。
  3. 案例:某站 GSC 持续报”同一个项目出现多次”。排查发现子主题继承了父主题的 schema 函数,又装了 Rank Math,两者都输出 Breadcrumb。用上面的 error_log 打印钩子,确认父主题函数名 parent_breadcrumb_schema 后 remove_action,警告第二天消失。
  4. ob_start 正则误删正常脚本,需限定 ld+json 且只删一段。
  5. 清缓存后才生效,改完务必清页面缓存与 CDN。

总结

判断标准:源码搜 ld+json 出现次数 > 你预期的数据源数,就说明重复。行动清单:打印 wp_head 钩子定位多余函数 → 子主题 remove_action → 或后台关主题 schema 开关 → 必要时 ob 缓冲兜底 → 清缓存 → GSC 复检。详见WordPress 上 Schema 的实现方式对比。

U
UFO_PF作者

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

留下你的想法

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