问题出现得很突然,日志倒是留得挺全。面包屑的 position 是从数据库里按字符串读出来的,JSON-LD 里输出成了 "position": "1" 带引号的形式。测试工具只提示类型不匹配,搜索结果里的路径展示却彻底没有了,连之前能显示的一层也不见了。
刚开始盯着「中间某一级 position 重复 两条记录争同一个序号」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。模板把 position 当成字符串拼接 没有做整数转换。少数情况下是层级从 0 开始计数 第一项被写成 0 与规范要求的起点不符。
另外,JSON-LD 生成时被转义了一次 数字变成了带引号的文本。
第一件事是看线上输出的原始标记
curl -s https://www.example.com/product/123 | grep -o '"position":[^,]*'
随后确认类型转换在模板里做了
$item['position'] = (int) $index + 1;
再往下检查是否存在重复序号
curl -s https://www.example.com/product/123 | grep -o '"position":[0-9]*' | sort | uniq -d
等前面都确认过,再用测试工具复验整段结构
curl -s -o /dev/null -w '%{http_code}\n' https://validator.schema.org/
怎么算真的好了,看的是同一批现象。把 position 强制转成整数并从 1 开始编号后,测试工具不再提示类型问题,搜索结果的路径展示在两周内恢复。
结构化数据里的数字字段不要靠模板拼接,任何一次转义或类型错误都会让整段标记失效而不是只丢一个字段。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
