修复 Search Console 结构化数据警告

Search Console 报 JSON-LD 警告——多半是缺推荐字段、@type 选错、日期格式不对或 image 用了相对路径。这里逐字段教你修。

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 更新)。但没有 headlineimagedatePublished 你照样拿不到 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 / BlogPostingheadline, image, datePublished, authorimage, author
Product(merchant listing)name, image, offers(含 price + priceCurrency + availabilityoffers.priceCurrency
Recipename, image, recipeIngredient, recipeInstructionsrecipeInstructions
Eventname, startDate, locationlocation 写法
FAQPagemainEntity[],每项含 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 警告,把精力放在 ArticleProduct 上。

怎么确认缺哪个字段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 偏好的宽高比:16x94x31x1
  • 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 文档

碰到 Articleimage 警告,两边都看:

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 InspectionRequest indexing——这比等例行重抓更快地重新抓取并重新解析 JSON-LD。

怎么确认修好了

  1. 对线上 URL 跑 Rich Results Test → 之前报警的字段现在有值了,没有红色项。这是判断的准绳;这里绿了,说明你的标记是对的。
  2. URL Inspection → Test live URL → View tested page → More info → Structured data 显示 Googlebot 在线上页面实际解析到的字段(能抓出”JSON-LD 由 JS 注入太晚”这种情况)。
  3. 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 专属的警告并不会恢复任何富媒体结果。优先搞 ArticleProduct

日期没带时区算不算坏了? 不算坏,是个警告。缺偏移时 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 更新)现在说没有严格必填的属性,只有推荐项。但实操上你仍需要 headlineimagedatePublished 才能拿到 Article 富媒体结果,所以哪怕文档措辞放松了,也当它们是必填的。

预防建议

  • 所有 JSON-LD 用一个 helper 生成,绝不逐页手写。
  • 每页只一个 @type;绝不 Article + BlogPosting 同时声明。
  • 日期一律走 new Date(...).toISOString()——不拼字符串,永远带时区。
  • 所有 URL 字段(image.urlauthor.url、publisher logo)必须绝对路径含 https://
  • 合并任何 schema 改动前先跑 Rich Results Test,绿勾才能合。
  • CI 解析每页 JSON-LD,必填字段缺失直接 fail 构建。

相关阅读

标签: #SEO #Google #Search Console #收录