改版脚本合并两个栏目时,同一篇文章被写了两次 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 不是小事,解析器可能整条丢弃,最终条目数会莫名少一截。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
