结构化数据必须用 BreadcrumbList 类型,itemListElement 数组需含 position 从1开始的 ListItem,item 必须为带 @id(绝对URL)或 name 的对象,JSON-LD 需服务端注入且与 HTML 结构严格一致,当前页用 aria-current="page" 且不可链接。

结构化数据必须用 BreadcrumbList,不是 Breadcrumb
Google 只认 @type: "BreadcrumbList",写成 @type: "Breadcrumb" 或自定义类型(比如 "MyBreadcrumbs")完全无效。常见错误是抄旧文档、套用 Microdata 写法到 JSON-LD 里,结果 Rich Results Test 显示 “No rich results detected”。
关键字段必须齐全且严格对齐:
-
itemListElement是必填数组,不能省略或拼错成itemListElements - 每个元素必须含
@type: "ListItem"、position(从1开始连续递增)、item -
item必须是对象,至少带@id(推荐绝对 URL)或name;只写字符串如"首页"会校验失败 - 如果首页路径是
/,@id必须是完整 URL,比如"https://example.com/",否则报 “missing field @id”
JSON-LD 必须随 HTML 一起下发,不能靠 JS 动态插入
搜索引擎抓取的是首屏 HTML(SSR 或静态生成内容),不是浏览器执行 JS 后的 DOM。在 React/Vue 的 useEffect 或 mounted 里动态创建并 append <script> 标签,爬虫根本看不到。
正确做法取决于渲染模式:
立即学习“前端免费学习笔记(深入)”;
- Next.js:用
next/head或useHead注入,确保 script 在<head>中输出 - Nuxt:用
useHead或head: {}配置项 - 纯静态页:手写或构建脚本(如 Node.js/Python)在生成 HTML 时注入
- 服务端模板(PHP/Jinja):调用
json_encode()或对应语言的安全序列化函数,禁止字符串拼接
漏掉 type="application/ld+json" 或写成 text/json,整个 script 就不生效。
HTML 结构与 JSON-LD 必须逐项一致
两者顺序、文本、URL 必须完全匹配,差一个空格或大小写都可能导致富片段不展示,甚至被算法降权。
常见断裂点:
-
<ol>中第 3 个<li>显示 “无线耳机”,但 JSON-LD 里对应name写成 “蓝牙耳机” - HTML 中链接是
/products/audio/wireless.html,JSON-LD 的@id却是/products/audio/ - position 编号跳号(比如
1, 2, 4),或从0开始 - 多语言站点没同步
hreflang,@id指向了错误语言版本的 URL
当前页必须用 aria-current="page",且不能加链接
这是可访问性与语义的硬性要求。用 class="active"、aria-disabled="true" 或 aria-current="true" 都无效——只有 aria-current="page" 能让屏幕阅读器明确播报“XX 当前页面”。
当前页项必须是 <ol> 中最后一个 <li>,且内部不能包 <a>。上级页链接则必须真实可达,禁用 # 或空 href。
分隔符(如 ›)必须用 CSS ::before/::after 生成,不能写死在 HTML 里;否则读屏会逐字读出“首页 、 分类 、 当前页面”,破坏语义流。



















