本文约 6,540 字,预计阅读 17 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:标注写了,GSC 里却显示 0 个条目
一个 WordPress 博客给所有文章都输出了 Article 的 JSON-LD,代码看起来和官方示例一模一样。但 GSC 的增强功能报告里,文章类型显示“已检测到 0 个条目”,或者检测到了但伴随着一堆「缺少字段 headline」「缺少字段 image」的报错。
这类问题几乎全部出在字段的取值而不是字段的存在:写了 headline 但长度超过 110 字符、写了 dateModified 但格式不是 ISO 8601、写了 image 但图片被 robots 屏蔽或尺寸小于 Google 要求。JSON 语法合法不等于 Google 认可——语法校验器和 Google 的检测是两回事。
原理分析:Article 的三个子类型与字段约束
Article 有三个常用子类型:Article(通用)、NewsArticle(新闻类)、BlogPosting(博客文章)。Google 对它们的富媒体要求基本一致,选择原则是按内容性质选最贴切的那个:博客用 BlogPosting,资讯站用 NewsArticle,不确定用 Article。
必填字段(缺少则不识别):
headline:文章标题,Google 建议不超过 110 字符image:至少一张配图,建议 1200px 宽以上,且可匿名抓取datePublished:首次发布时间,ISO 8601 格式,带时区dateModified:最后修改时间,同上(Google 用它判断内容新鲜度)author:作者,推荐用Person对象并带name(也可以是Organization)publisher:发布方,必须是Organization,且推荐包含logo(ImageObject)mainEntityOfPage:指向该页面的WebPage,用于明确实体关系
推荐字段: description、articleSection、inLanguage、wordCount、keywords、articleBody。其中 wordCount 与 articleBody 对内容理解有帮助,但会让 JSON 体积变大,按需使用。
| 字段 | 常见错误 | 正确取值 |
|---|---|---|
headline |
超过 110 字符、包含站点名后缀 | 只写标题本身 |
image |
相对路径、被 robots 屏蔽、尺寸过小 | 绝对 URL,≥1200px 宽 |
datePublished |
2026/04/02 或时间戳 |
2026-04-02T09:14:22+08:00 |
dateModified |
与发布时间相同且从不更新 | 真实修改时间 |
author |
只写字符串 | Person 对象,带 name 与 url |
publisher |
缺失 logo |
Organization + logo 的 ImageObject |
保姆级实操
步骤 1:确认主题或插件没有重复输出。 Yoast SEO、Rank Math、All in One SEO 都会自动输出 Article schema。开启其中一个插件就不要自己再输出一份,重复的同类标注会让 Google 无法判断该用哪个。如果确实要自定义,先在插件里关掉文章 schema。
步骤 2:确认已有关联的实体标注。 文章页的 publisher 应与首页的 Organization 是同一个实体(用相同的 @id 引用)。这部分与 Google 结构化数据入门 讲的是同一套图结构。
步骤 3:一份完整的 Article JSON-LD 示例:
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"@id": "https://www.example.com/blog/google-seo-guide/#article",
"isPartOf": { "@id": "https://www.example.com/blog/google-seo-guide/" },
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://www.example.com/blog/google-seo-guide/"
},
"headline": "WordPress 站点接入 Google Search Console 的完整流程",
"description": "从资源类型选择、DNS 验证到站点地图提交,逐步骤说明 WordPress 站点接入 GSC 时的关键决策点。",
"image": {
"@type": "ImageObject",
"url": "https://www.example.com/wp-content/uploads/2026/04/gsc-cover.jpg",
"width": 1200,
"height": 675
},
"datePublished": "2026-04-02T09:14:22+08:00",
"dateModified": "2026-04-18T16:30:00+08:00",
"inLanguage": "zh-CN",
"wordCount": 2380,
"articleSection": "Google SEO",
"author": {
"@type": "Person",
"name": "李工",
"url": "https://www.example.com/author/ligong/"
},
"publisher": {
"@type": "Organization",
"@id": "https://www.example.com/#organization",
"name": "迷芒飞",
"logo": {
"@type": "ImageObject",
"url": "https://www.example.com/wp-content/uploads/2026/01/logo.png",
"width": 512,
"height": 512
}
}
}
步骤 4:在 WordPress 里动态生成。 下面这段代码用真实的核心函数取值,只在单篇文章页输出,并自动处理日期格式与特色图:
add_action( 'wp_head', function () {
if ( ! is_singular( 'post' ) ) {
return;
}
$post_id = get_queried_object_id();
// 有 SEO 插件输出 schema 时请直接 return,避免重复标注
if ( defined( 'WPSEO_VERSION' ) || class_exists( 'RankMath' ) ) {
return;
}
$thumb_id = get_post_thumbnail_id( $post_id );
$image_url = $thumb_id ? wp_get_attachment_image_url( $thumb_id, 'full' ) : '';
if ( ! $image_url ) {
return; // image 是必填字段,没有配图就不输出
}
$author_id = (int) get_post_field( 'post_author', $post_id );
$author_name = get_the_author_meta( 'display_name', $author_id );
$author_url = get_author_posts_url( $author_id );
$data = [
'@context' => 'https://schema.org',
'@type' => 'BlogPosting',
'@id' => get_permalink( $post_id ) . '#article',
'mainEntityOfPage' => [
'@type' => 'WebPage',
'@id' => get_permalink( $post_id ),
],
'headline' => mb_substr( get_the_title( $post_id ), 0, 110 ),
'description' => wp_strip_all_tags( get_the_excerpt( $post_id ) ),
'image' => [
'@type' => 'ImageObject',
'url' => $image_url,
'width' => wp_get_attachment_image_src( $thumb_id, 'full' )[1] ?? 1200,
'height' => wp_get_attachment_image_src( $thumb_id, 'full' )[2] ?? 675,
],
'datePublished' => get_the_date( DATE_W3C, $post_id ),
'dateModified' => get_the_modified_date( DATE_W3C, $post_id ),
'inLanguage' => get_bloginfo( 'language' ),
'author' => [
'@type' => 'Person',
'name' => $author_name,
'url' => $author_url,
],
'publisher' => [
'@type' => 'Organization',
'@id' => home_url( '/' ) . '#organization',
'name' => get_bloginfo( 'name' ),
],
];
echo '<script type="application/ld+json">' .
wp_json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) .
'</script>' . "\n";
}, 20 );
步骤 5:验证输出。 用 curl 抓页面源码确认 JSON 出现在 HTML 里(而不是靠 JS 插入),确认日期是 DATE_W3C 格式(等价 ISO 8601),确认图片 URL 是绝对路径。
步骤 6:用两个工具校验。 富媒体结果测试工具看 Google 视角的识别结果,Schema.org 校验器看语法。两个都通过才算合格。
步骤 7:在 GSC 里跟踪。 部署几天后看「增强功能 → 文章」的条目数与错误列表,按错误类型批量修。
常见踩坑
- SEO 插件与自定义代码双重输出。 Google 会看到两份冲突的 Article 标注。
headline带了站点名后缀。 建议控制在 110 字符内且只写标题。- 没有特色图就输出了一份不带 image 的标注。 必填字段缺失,整段作废,不如不输出。
- 日期用
get_the_date('Y-m-d')而非DATE_W3C。 缺时区,可能被判无效。 publisher不带logo。 Google 推荐字段,缺失会影响展现质量。- 图片被 robots.txt 屏蔽。 校验通过但 Google 检测失败,是最难排查的一类。
- 案例: 一个站点的文章 schema 长期报错「缺少字段 image」,但源码里明明有 image。排查后发现:特色图存在媒体库里,但主题输出的
url是 CDN 的相对路径(/wp-content/uploads/...),且该 CDN 域名与站点域名不同、又被 robots 屏蔽。改成完整绝对 URL 并放开 CDN 域名的抓取后,报错当天清零。校验器只看语法,Google 还要能真的抓到那张图。
总结
Article 标注的落地顺序:确认没有重复输出 → 取到真实的特色图绝对 URL → 用 DATE_W3C 输出日期 → 补全 author 与 publisher(publisher 用 @id 复用首页 Organization)→ 服务端直出 JSON-LD → 用富媒体测试工具与 Schema.org 校验器双重验证 → 在 GSC 增强功能报告里跟踪条目数与错误。判断标准很简单:GSC 里文章类型的错误数为 0、条目数与文章总数接近。做到这两点,标注部分就合格了,剩下的展现形态由 Google 决定。
