为什么结构化数据值得每个站长认真做一次
你有没有在 Google 搜索结果里见过带星级评分、价格区间、面包屑路径、有时还带"常见问答"展开的富媒体结果?那些不是 Google 自动猜出来的,而是站长通过结构化数据(structured data)明确告诉搜索引擎"这个页面是什么、里面有什么"得到的回报。对个人站长来说,这是投入产出比很高的一件事:一次配置,长期享受更高点击率和更精准的流量。
目前搜索引擎最推荐的结构化数据格式是 JSON-LD——一段嵌在页面里的 JSON 脚本,不侵入 HTML 结构,维护方便。这篇教程从零讲清楚主要类型、写法、在 WordPress 与自研站点里的落地方式,以及上线前怎么验证和排错。
JSON-LD 相比微数据、RDFa 好在哪
结构化数据有三种主流写法:Microdata(在 HTML 标签里加 itemprop)、RDFa、以及 JSON-LD。三者搜索引擎都认,但 JSON-LD 有明显优势:
- 内容和展示解耦:JSON-LD 放在
<script type="application/ld+json">里,不要求和可见文字一一对应,改版式不会破坏结构化数据。 - 一处集中维护:所有字段写在一个 JSON 块里,比散落在几十个标签上的 itemprop 好读好改。
- Google 官方推荐:Google 文档明确表示优先支持 JSON-LD,工具链和校验也最完善。
所以除非你有遗留系统必须用 Microdata,否则直接上 JSON-LD。
基础骨架:@context 与 @type
最简单的 JSON-LD 长这样,放在 <head> 或 <body> 里都行:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "一个草根站长的博客",
"url": "https://www.zz1984.com/"
}
</script>
两个必填字段:
@context:固定为https://schema.org,声明用哪套词汇表。@type:说明这个对象是什么类型。常用类型见下表。
最常用的几种类型与字段
1. Article / BlogPosting(文章页)
博客文章页最该加的就是这个,配合 Google 的"头条内容轮播"展示:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "rsync --link-dest 快照备份实战",
"datePublished": "2026-10-10T09:00:00+08:00",
"dateModified": "2026-10-10T09:00:00+08:00",
"author": {
"@type": "Person",
"name": "草根站长"
},
"publisher": {
"@type": "Organization",
"name": "一个草根站长的博客",
"logo": {
"@type": "ImageObject",
"url": "https://www.zz1984.com/logo.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://www.zz1984.com/1569.html"
},
"image": "https://www.zz1984.com/cover/1569.png"
}
</script>
几点注意:headline 建议控制在 110 字符内;datePublished 用 ISO 8601 带时区偏移的格式,别写"2026/10/10"这种;image 至少 1200px 宽、能被 Google 抓取,否则富结果可能不展示。
2. BreadcrumbList(面包屑)
让搜索结果里显示层级路径,提升可读性:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "首页", "item": "https://www.zz1984.com/"},
{"@type": "ListItem", "position": 2, "name": "服务器运维", "item": "https://www.zz1984.com/category/ops/"},
{"@type": "ListItem", "position": 3, "name": "rsync 快照备份实战"}
]
}
</script>
position 必须从 1 开始连续递增,最后一项可以省略 item(因为就是当前页)。
3. FAQPage(常见问答)
把页面里的问答块标记成 FAQ,有机会在结果里直接展开答案,抢占更多展示面积:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "JSON-LD 应该放在 head 还是 body?",
"acceptedAnswer": {
"@type": "Answer",
"text": "两者都可以,Google 都能解析。习惯上放在 head 便于集中管理。"
}
},
{
"@type": "Question",
"name": "结构化数据和可见内容必须一致吗?",
"acceptedAnswer": {
"@type": "Answer",
"text": "必须一致。标记了页面上不存在的问答属于误导,会被判定为垃圾结构化数据。"
}
}
]
}
</script>
重要红线:结构化数据里的内容必须和页面可见内容对应。凭空捏造评分、价格、问答来骗富结果,一旦被识别,会导致整站结构化数据被降权甚至人工惩罚。
4. Organization 与 SiteNavigationElement
首页可以加 Organization 声明站点主体信息(名称、logo、社交账号),帮助建立"品牌实体",对 E-E-A-T 有正面作用。同域名下建议用 @id 做实体引用,避免重复声明:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://www.zz1984.com/#org",
"name": "一个草根站长的博客",
"url": "https://www.zz1984.com/",
"sameAs": ["https://github.com/yourname"]
}
</script>
在 WordPress 站点里落地
如果你用 WordPress,有两条路径:
- 装插件(如 Yoast、Rank Math):它们会自动输出 Article 和 BreadcrumbList,省事但字段固化,想加自定义类型要写过滤器。
- 主题函数手动输出:在
header.php或通过wp_head钩子注入。给文章页动态拼 JSON 的示例:
add_action('wp_head', function () {
if (!is_singular('post')) return;
$data = [
'@context' => 'https://schema.org',
'@type' => 'BlogPosting',
'headline' => get_the_title(),
'datePublished' => get_the_date('c'),
'dateModified' => get_the_modified_date('c'),
'author' => ['@type' => 'Person', 'name' => get_the_author()],
'mainEntityOfPage' => get_permalink(),
];
echo '<script type="application/ld+json">'
. wp_json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
. '</script>';
});
关键点:用 wp_json_encode 而不是 json_encode,并带上 JSON_UNESCAPED_UNICODE,否则中文会被转义成 \uXXXX,虽然合法但可读性差;date('c') 输出 ISO 8601 格式,正好满足要求。别忘了用 esc_js 或确保标题里没有 </script> 之类的破坏字符——用 wp_json_encode 本身会安全转义。
自研站点(PHP/静态)怎么加
纯手工站点就更直接了,在生成 HTML 模板时把字段拼进去即可。要保证每个页面的 @id 唯一且稳定(用永久链接),同一实体在多个页面出现时用相同的 @id 引用,形成互相印证的知识图谱,而不是各写各的。
上线验证:三个必做步骤
- Rich Results Test:Google 官方的富结果测试工具,粘贴 URL 或代码,直接告诉你检测到哪些类型、有没有错误或警告。这是上线前必跑的第一道关。
- Schema Markup Validator(validator.schema.org):比 Google 工具更严格,能校验词汇表层面的合法性,排查拼写错误、类型不匹配。
- Search Console 的"增强功能"报告:上线几天后回来看,Google 会列出实际抓取到的结构化数据有效项、无效项和警告趋势。这是唯一反映"真实收录效果"的地方。
验证时常见报错和对策:
- "Missing field 'image'":Article 类型强烈建议提供 image,补上可抓取的图片 URL。
- "Invalid date format":日期必须是 ISO 8601(
2026-10-10T09:00:00+08:00),不能是2026-10-10 09:00。 - "Value in 'position' not a number":面包屑的 position 被写成了字符串,改成数字。
- 抓取工具看不到 JSON-LD:多半是页面用了前端框架异步注入、而 Google 抓取时脚本没执行完。优先在服务端渲染时输出,别依赖纯客户端 JS。
别踩的几个坑
- 不要堆类型:一页一个主类型即可,硬塞 Article + Product + FAQ 混在一起反而让解析器困惑,选最贴合页面内容的那个。
- 内容和标记必须一致:这是最容易招致惩罚的点。页面上写"评分 5 星"才标评分,没有就别标。
- 别用已经被废弃的类型:查询前先看 Google 文档里当前支持的类型列表,一些老类型(如某些 HowTo 场景)已停止富结果展示,标了也没用。
- JSON 必须合法:少个逗号、多个尾逗号都会让整块数据失效。发布前用
jq校验一遍:echo "$JSON" | jq .。 - 同域名保持统一:别一部分页面写 www、一部分不写,URL 要和你站点 canonical 保持一致。
结构化数据不是一次性配置就完事的活儿——每次改版、新增内容类型,都要回头看 Search Console 的增强报告。但只要基础打对了,它带来的富媒体展示和更高点击率,是纯靠"写更多文章"很难在短期内达到的。花一个下午把 Article、BreadcrumbList 和几个 FAQ 配好,可能就是这一年性价比最高的一次 SEO 投入。