Search Console 的结构化数据报告会跳出 Missing field "image"、Invalid value in field "datePublished"、Either "author" or "publisher" must be specified 这类警告。它们基本不会影响收录,但会让你拿不到 rich result——没作者署名、没评分星级、没商品价格卡。本该拿到富媒体展示的页面少了这些,CTR 通常会掉 10-30%。
最快的修法:打开 Rich Results Test,粘贴线上 URL,看它具体点名哪个字段出错。然后回到源头(你的 JSON-LD 生成逻辑)只改那一个字段,重新部署,再到 Search Console 点 Validate fix。十有八九问题就是这几类之一:image 用了相对路径、日期没带时区、author 写成了裸字符串,或者同一页声明了两个冲突的 @type。
2026 年有个变化要注意:Google 现在不再把 Article 的任何属性标为严格”必填”,统一改叫”推荐”(文档 2025-12-10 更新)。但没有 headline、image、datePublished 你照样拿不到 Article 富媒体结果,所以实操上仍把这三个当必填对待。
先看你属于哪一类
| 警告文案(Rich Results Test / Search Console) | 最可能的原因 | 跳转 |
|---|---|---|
Missing field "image" 或 "author" | 字段没写,或写了但是空 | 缺字段 |
Invalid value in field "datePublished" | 日期格式不对,或没带时区 | 日期格式 |
Datetime ... is missing a timezone | 日期本身合法但缺时区偏移(这是提示,不是硬错误) | 日期格式 |
Missing field "priceCurrency"(Product) | priceCurrency 没放在 offer 这一层 | 缺字段 |
Parsing error / Unparsable structured data | 多了逗号或 JSON 写坏了 | 语法错误 |
| 识别到两个类型、互相冲突 | 同页同时写了 Article + BlogPosting | 类型选错 |
| image 被标为太小 / 无法抓取 | URL 是相对路径、被屏蔽、或尺寸不达标 | image 字段 |
常见原因
1. 缺推荐字段
Google 在 2025 年底把 Article 的”required”措辞去掉了,但富媒体结果仍然需要某些字段。截至 2026 年 6 月,各类型实操上需要的字段如下:
| 类型 | 富媒体结果实际需要的字段 | 最常被漏 |
|---|---|---|
Article / BlogPosting | headline, image, datePublished, author | image, author |
Product(merchant listing) | name, image, offers(含 price + priceCurrency + availability) | offers.priceCurrency |
Recipe | name, image, recipeIngredient, recipeInstructions | recipeInstructions |
Event | name, startDate, location | location 写法 |
FAQPage | mainEntity[],每项含 name + acceptedAnswer.text | 见下方说明 |
FAQPage 说明(2026 年重要变化): Google 已废弃 FAQ 富媒体结果——2026 年 5 月 7 日起搜索结果里不再展示可折叠的 FAQ 下拉,FAQ 报告和 Rich Results Test 支持在 2026 年 6 月被移除(Search Console API 在 2026 年 8 月停掉)。合法的 FAQPage 标记本身不会报错,也没必要急着删,但 acceptedAnswer.text 上的警告现在已经影响不到任何可见的富媒体结果了。别再花时间追 FAQ 警告,把精力放在 Article 和 Product 上。
怎么确认缺哪个字段:Rich Results Test 会把识别到的每个字段都列出来,并精确点名缺失的那个。红色 = 影响资格的字段缺失或无效;黄色 = 推荐字段缺失(页面仍有资格)。
2. 类型选错
Article 是基类,BlogPosting 用于博文,NewsArticle 用于符合 Google News 收录的新闻内容。同一页声明两个会让 Google 任选一个,还可能报冲突警告。经验法则:
- 想进 Google News 的新闻媒体 →
NewsArticle - 个人或公司博客文章 →
BlogPosting - 一般技术指南 / 文档 →
Article
选一个,每页只输出一个 @type。
3. 日期格式
Google 要求 ISO 8601。注意最后一行的修正——缺时区是提示,不是硬性失败:
"datePublished": "2026-05-21T10:00:00Z" // 最佳:带时区(Z = UTC)
"datePublished": "2026-05-21T10:00:00+08:00" // 最佳:写明偏移
"datePublished": "2026-05-21" // 合法:只有日期
"datePublished": "2026/05/21" // 无效:用了斜杠
"datePublished": "May 21, 2026" // 无效:人类可读文字
"datePublished": "2026-05-21T10:00:00" // 警告:没带时区
最后这种情况,Google 文档说如果省略偏移,它会默认采用 Googlebot 的时区,所以富媒体结果不会坏——但署名日期可能跟你预期差几个小时。修法就是始终带上偏移。new Date(...).toISOString() 一定会补上 Z,顺手就解决了。
4. image 字段格式
image 可以是 URL,也可以是 ImageObject。无论哪种,都必须是绝对路径(完整 https://...)、可抓取(没被 robots.txt 屏蔽)、且尺寸足够大。
// 简单字符串写法(Article 接受)
"image": "https://yourdomain.com/cover.jpg"
// 完整推荐写法
"image": {
"@type": "ImageObject",
"url": "https://yourdomain.com/cover.jpg",
"width": 1200,
"height": 630
}
尺寸规则,截至 2026 年 6 月:
- Article 图片: 宽乘高至少 50,000 像素(比如
1200x630就够了)。Google 偏好的宽高比:16x9、4x3、1x1。 - Product 图片: Google 把最低分辨率提到了
500x500像素——2026 年 4 月 14 日起开始发警告,2027 年 1 月 31 日起强制执行。现在就把商品图做到 500×500 或更大。
相对路径 /cover.jpg 是最常见的 image 警告,必须以 https:// 开头。
5. author 写成裸字符串
// 容易触发警告
"author": "Jane Doe"
// 推荐写法
"author": {
"@type": "Person",
"name": "Jane Doe",
"url": "https://yourdomain.com/about"
}
author.name 里只放名字——别带头衔、别带 “by”、别混进出版方名称。author.url 应指向一个能唯一标识该作者的页面(about / 简介页),Google 现在用它来归属作者身份。
6. JSON-LD 语法错误
JSON-LD 必须是合法 JSON。一个多余的 trailing comma 就能让整段失效,Search Console 会把它归到 Unparsable structured data 报告里。Schema.org 验证器 和 Rich Results Test 都会报成 Parsing error。常见祸首:多余逗号、从文档里粘进来的中文/弯引号、字符串里没转义的引号。
最短修复路径
Step 1:用 Rich Results Test 拿到精确报错
https://search.google.com/test/rich-results
粘贴线上 URL(或用 Test code 直接粘 JSON-LD 源码)。你会看到:
- 识别到哪些 schema 类型,
- 每个字段解析出的值,
- 红色项 = 影响资格的字段缺失或无效,
- 黄色项 = 推荐字段缺失(仍有资格)。
把报警字段名一字不差地记下来——要修的就是它。
Step 2:对照 Schema.org 和 Google 文档
碰到 Article 的 image 警告,两边都看:
https://schema.org/Article (Schema.org 定义)
https://developers.google.com/search/docs/appearance/structured-data/article (Google 的额外要求)
Schema.org 告诉你字段存不存在、期望什么类型;Google 那页告诉你它是不是富媒体结果所需,以及尺寸/格式上的约束。两边不总是一致,而 Search Console 执行的是 Google 的规则。
Step 3:JSON-LD 用一个 helper 统一生成
手写 JSON-LD 正是警告的来源。用一个函数统一生成,让每页都一致:
// src/lib/jsonld.js
export function articleJsonLd({ title, slug, image, publishedAt, modifiedAt, author }) {
const url = `https://yourdomain.com/articles/${slug}/`;
return {
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": title,
"image": {
"@type": "ImageObject",
"url": image.startsWith("http") ? image : `https://yourdomain.com${image}`,
"width": 1200,
"height": 630
},
"datePublished": new Date(publishedAt).toISOString(),
"dateModified": new Date(modifiedAt || publishedAt).toISOString(),
"author": {
"@type": "Person",
"name": author?.name || "AI Productivity Guide Team",
"url": author?.url || "https://yourdomain.com/about"
},
"publisher": {
"@type": "Organization",
"name": "Your Site",
"logo": {
"@type": "ImageObject",
"url": "https://yourdomain.com/logo.png",
"width": 600,
"height": 60
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": url
}
};
}
这一下就堵住了三个最常见的警告:image.startsWith("http") 这个判断强制绝对路径,new Date(...).toISOString() 强制 ISO 8601 并带 Z 偏移,author 永远是带 url 的对象。
模板里把它输出成 script 标签(注意用 set:html,避免 Astro 转义 JSON):
---
import { articleJsonLd } from "../lib/jsonld.js";
const ld = articleJsonLd(Astro.props);
---
<script type="application/ld+json" set:html={JSON.stringify(ld)} />
Step 4:CI 加校验,杜绝回退
解析每个产出页面的 JSON-LD,缺字段或 JSON 坏了就让构建失败:
// scripts/check-jsonld.mjs
import fg from "fast-glob";
import fs from "node:fs";
const issues = [];
for (const f of fg.sync("dist/**/*.html")) {
const html = fs.readFileSync(f, "utf8");
const blocks = [...html.matchAll(/<script[^>]+ld\+json[^>]*>([\s\S]+?)<\/script>/g)];
if (blocks.length === 0) { issues.push(`NO JSON-LD: ${f}`); continue; }
for (const [, body] of blocks) {
try {
const data = JSON.parse(body);
if (!data["@type"]) issues.push(`MISSING @type: ${f}`);
if (data["@type"] === "BlogPosting") {
if (!data.headline) issues.push(`MISSING headline: ${f}`);
if (!data.image) issues.push(`MISSING image: ${f}`);
if (!data.datePublished) issues.push(`MISSING datePublished: ${f}`);
if (!data.author) issues.push(`MISSING author: ${f}`);
}
} catch (e) {
issues.push(`INVALID JSON: ${f} -- ${e.message}`);
}
}
}
if (issues.length) { console.error(issues.join("\n")); process.exit(1); }
这能在问题到达 Google 之前就拦住。想做超出”存在性”检查的 schema 正确性校验,可以在上面叠一层 schema-dts 类型,或调用 Schema.org validator API。
Step 5:部署后在 Search Console 点 Validate fix
到左侧栏 Enhancements 下对应的结构化数据报告(Google 一旦在站点上检测到该类型就会自动出现),点 Validate fix。Google 会立刻抽查一批;字段确实修好了,它就开始重新评估,把所有受影响 URL 清干净通常要 7-14 天。如果抽查样本还是失败,验证会停下并告诉你原因。
想加速最重要的几个页面,对 5-10 个头部 URL 打开 URL Inspection 点 Request indexing——这比等例行重抓更快地重新抓取并重新解析 JSON-LD。
怎么确认修好了
- 对线上 URL 跑 Rich Results Test → 之前报警的字段现在有值了,没有红色项。这是判断的准绳;这里绿了,说明你的标记是对的。
- URL Inspection → Test live URL → View tested page → More info → Structured data 显示 Googlebot 在线上页面实际解析到的字段(能抓出”JSON-LD 由 JS 注入太晚”这种情况)。
- Search Console 增强项报告 在重抓之后才会把 URL 从 “Invalid” 移到 “Valid”(就是那 7-14 天的窗口)。Rich Results Test 先变绿是正常的——报告会滞后于抓取。
如果 Rich Results Test 已经绿了,但两周后 Search Console 还在报警,就对这些 URL 点 Request indexing;报告基本只是滞后,不是真错。
常见问题
结构化数据警告会拖累我的排名吗? 不会。它不影响抓取、收录或排名,只决定你有没有资格拿富媒体结果(星级、署名、价格卡)。代价是本能拿到富媒体展示的页面丢了 CTR,不是丢排名。
Rich Results Test 过了,但 Search Console 还在报警,为什么? 报告反映的是 Google 上一次抓取,不是你最新的部署。线上 URL 的 Rich Results Test 一旦变绿,修复就已经生效;报告会在重抓后追上来(常 7-14 天)。对关键 URL 点 Request indexing 催一下。
2026 年 FAQ schema 的警告还值得修吗?
不值得。Google 已废弃 FAQ 富媒体结果——2026 年 5 月 7 日起搜索里不再展示,FAQ 报告和 Rich Results Test 支持在 2026 年 6 月移除。已有的 FAQPage 标记留着无害,但修 FAQ 专属的警告并不会恢复任何富媒体结果。优先搞 Article 和 Product。
日期没带时区算不算坏了?
不算坏,是个警告。缺偏移时 Google 默认用 Googlebot 的时区,富媒体结果照常工作,但署名日期可能漂几个小时。用带偏移的 ISO 8601(new Date(x).toISOString() 会给你一个 Z),警告就消失。
我的 image URL 看着没问题,还是报警,哪里错了?
通常三种原因:它是相对路径(必须以 https:// 开头);它被 robots.txt 屏蔽或返回非 200;或者它低于尺寸下限(Article 是 50,000 像素,Product 自 2026 年 4 月起是 500×500)。直接在浏览器里打开图片 URL,确认能加载、且够大。
Article 的”必填字段”说法去哪了?
Google 的 Article 文档(2025-12-10 更新)现在说没有严格必填的属性,只有推荐项。但实操上你仍需要 headline、image、datePublished 才能拿到 Article 富媒体结果,所以哪怕文档措辞放松了,也当它们是必填的。
预防建议
- 所有 JSON-LD 用一个 helper 生成,绝不逐页手写。
- 每页只一个
@type;绝不Article+BlogPosting同时声明。 - 日期一律走
new Date(...).toISOString()——不拼字符串,永远带时区。 - 所有 URL 字段(
image.url、author.url、publisher logo)必须绝对路径含https://。 - 合并任何 schema 改动前先跑 Rich Results Test,绿勾才能合。
- CI 解析每页 JSON-LD,必填字段缺失直接 fail 构建。