文章标题在编辑器里带了一个不换行空格,输出到 JSON-LD 的 headline 字段变成了「前端 性能 优化 实践」这种形态。富媒体测试工具提示字段为空,页面上标题却显示正常,肉眼完全看不出差别。

原因不止一个,得分开看。编辑器保存的是富文本 实体字符被原样写进了结构化数据;模板对 headline 只做了 HTML 转义 没有还原成普通空格;标题里的全角空格在解析时被当成不可见字符整段丢弃;同一字段在 Open Graph 和 JSON-LD 里取值不同 两边对不上。

第一件事是确认 headline 的原始字节

curl -s https://www.example.com/post/123 | grep -o '"headline":"[^"]*"' | hexdump -C | head -3

随后把实体和不可见字符统一清掉

$h = trim(preg_replace('/[\x{00A0}\x{3000}]/u', ' ', html_entity_decode($title)));

再往下输出前再做一次规范空白

echo json_encode(['headline' => $h], JSON_UNESCAPED_UNICODE);

复验两处标题是否一致

curl -s https://www.example.com/post/123 | grep -c 'property="og:title"'

改完先别撤,确认这几项。清理后 headline 变成正常空格,测试工具不再报空字段,文章富媒体在重新抓取后恢复展示。

结构化数据里的文本字段最好只放纯文本,任何实体、全角空格、零宽字符都可能让整个字段被判为空。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189