阅读提示
本文约 1,437 字,预计阅读 4 分钟。文中命令与配置均经过实测,可直接参考执行。
本文约 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 );
} );
} );
常见踩坑
- remove_action 的优先级写错,函数没被移除,因为主题挂的是
20不是10。 - 在父主题改,一更新主题改动就被覆盖,必须放子主题。
- 案例:某站 GSC 持续报”同一个项目出现多次”。排查发现子主题继承了父主题的 schema 函数,又装了 Rank Math,两者都输出 Breadcrumb。用上面的
error_log打印钩子,确认父主题函数名parent_breadcrumb_schema后remove_action,警告第二天消失。 - ob_start 正则误删正常脚本,需限定
ld+json且只删一段。 - 清缓存后才生效,改完务必清页面缓存与 CDN。
总结
判断标准:源码搜 ld+json 出现次数 > 你预期的数据源数,就说明重复。行动清单:打印 wp_head 钩子定位多余函数 → 子主题 remove_action → 或后台关主题 schema 开关 → 必要时 ob 缓冲兜底 → 清缓存 → GSC 复检。详见WordPress 上 Schema 的实现方式对比。
觉得有用?点个赞支持一下
标签:
# GSC 警告
# GSC 重复字段警告
# JSON-LD
# remove_action
# schema 去重
# WordPress schema 去重
# wp_head
# wp_head 重复标记
# 关闭主题 schema
# 移除重复 JSON-LD
# 结构化数据重复输出
