先看现象。页面里先输出 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,测试工具显示两项都有效。

补一句。多个插件各输出一段时,优先合并而不是直接删掉其中一个。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189