先看现象。页面里先输出 Yoast 的 @context https://schema.org,又手写一段 @context http://schema.org,两段 JSON-LD 并存,测试工具只读到第一段,评分标记丢失。
原因不止一个,得分开看。两段脚本各自独立,解析器按文档顺序只取一段。还有一种是手写那段用了 http 协议,被判无效。
还有一种情况,两段 @type 重复,后者被合并丢弃。
另外,输出位置一个在 head 一个在 body,顺序不固定。
数页面里有几段 JSON-LD
curl -s https://www.example.com/product/1/ | Select-String "application/ld\+json" | Measure-Object -Line
随后合并成一段 @graph
echo '{"@context":"https://schema.org","@graph":[...]}';
然后统一 @context 的协议
curl -s https://www.example.com/product/1/ | Select-String "@context"
复核富媒体结果
curl -s "https://search.google.com/test/rich-results?url=https://www.example.com/product/1/" -o /dev/null -w "%{http_code}"
这次没动代码,只在配置和运行环境上找原因。
隔了一天再看,现象没变,说明不是偶发。
那几天正好在做别的变更,先把时间线对齐才敢动手。
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
改完先别撤,确认这几项。页面只剩一段 JSON-LD,@graph 里同时包含 Product 和 Breadcrumb,测试工具显示两项都有效。
补一句。多个插件各输出一段时,优先合并而不是直接删掉其中一个。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
