改版脚本合并两个栏目时,同一篇文章被写了两次 loc,整份文件里有 300 条这样的节点。GSC 显示文件读取成功但条目数比实际少 300,蜘蛛对这份文件的信任度也跟着下降。

一开始怀疑是「数据库里有大小写不同的重复 slug,拼接后地址一样」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。生成逻辑按栏目分别查询,没有对 URL 做全局去重。少数情况下是多语言版本共用同一个 loc,只是 hreflang 不同。

还有一种情况,文件用 DOM 拼接,重复节点覆盖了前一条的 lastmod。

动手时先找出重复的 loc

grep -o '<loc>[^<]*</loc>' sitemap.xml | sort | uniq -c | awk '$1>1'

生成时按地址去重

SELECT DISTINCT url FROM tmp_urls ORDER BY url;

大小写统一后再输出

UPDATE wp_posts SET post_name=LOWER(post_name) WHERE post_name<>LOWER(post_name);

校验节点数与库是否一致

grep -c '<url>' sitemap.xml

改完先别撤,确认这几项。重复节点清零,条目数和数据库里的已发布文章数一致,GSC 的已发现数同步追上。

同一份 sitemap 里出现重复 loc 不是小事,解析器可能整条丢弃,最终条目数会莫名少一截。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189