本文约 4,208 字,预计阅读 11 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:搜索结果里的五颗星,为什么忽隐忽现
最让人焦虑的不是没有星标,而是星标时有时无:昨天还显示星级,今天搜索结果里只剩标题;或者富媒体检测工具说没问题,实际线上从没出现过。结构化数据的规则非常细——Google 的富媒体结果并不是”写了就展示”,它要求类型匹配、字段完整、数据与页面可见内容一致。更危险的是反向情况:给自己的站点外贸 corporate 页面挂上自家打分合集,属于 self-serving reviews,明确被 Google 列为违规,可能招致结构化数据人工处罚(Search Console 里会收到「结构化数据」相关的手动处置通知)。
原理分析:AggregateRating 与 Review 不是一回事
两者都在 schema.org 命名空间里,但语义不同:
Review:某一作者针对某一客体写的具体点评,必填author、itemReviewed、reviewRating。AggregateRating:一组评分的统计结果,必填ratingCount(或reviewCount)、ratingValue、bestRating。
Google 支持的评分富媒体类型有限,主要集中在 Product、Book/Movie/Course、Recipe、SoftwareApp、LocalBusiness 等。注意 LocalBusiness 与 Organization 不允许为自身(运营方自己)标注自评分;多家第三方平台聚合而来也有明确限制。
| 场景 | 可用类型 | 备注 |
|---|---|---|
| 商品销售页 | Product + AggregateRating |
需与真实累计评价数一致 |
| 书评/影评文章 | Book/Movie + Review |
作者必须是真实的人或组织 |
| 在线课程 | Course |
注意 Course 的展示规则近年有收紧 |
| 工具/软件 | SoftwareApp |
需提供 applicationCategory 等字段 |
最稳妥的实现方式是 JSON-LD(<script type="application/ld+json">),而不是 microdata——尤其在 WordPress 这种主题会被频繁改动的场景。
保姆级实操
步骤 1:先审 yet 数据真实性。 如果你的评分是编辑主观打分且为你自己的产品/服务,那就不要标;如果页面上确实没有任何可见星级,也不要标(Google 要求页面可见内容与结构化数据一致)。
步骤 2:装评测网址的结构化数据。 如果不想手写,可用 Schema & Structured Data for WP & AMP (SASWP) 这类专门方案,或启用 Yoast SEO / Rank Math 自带图形化处理。三个方案同时开会产生重复图形化归档输出,务必只选一个。
步骤 3:手写 JSON-LD 输出(最可控)。 下面代码挂在 wp_head,只在评测单页输出,并做了边界防护:
add_action( 'wp_head', function () {
if ( ! is_singular( 'review' ) ) {
return;
}
$post_id = get_queried_object_id();
$rating = (float) get_post_meta( $post_id, 'rating_total', true );
$count = (int) get_post_meta( $post_id, 'rating_count', true );
if ( $rating <= 0 || $count <= 0 ) {
return; // 没有真实评分数据就不要输出
}
$data = [
'@context' => 'https://schema.org',
'@type' => 'Review',
'itemReviewed'=> [ '@type' => 'Thing', 'name' => get_the_title( $post_id ) ],
'author' => [ '@type' => 'Person', 'name' => get_the_author_meta( 'display_name', get_post_field( 'post_author', $post_id ) ) ],
'datePublished' => get_the_date( 'c', $post_id ),
'reviewRating' => [
'@type' => 'Rating',
'ratingValue' => $rating,
'bestRating' => 10,
'worstRating' => 0,
],
'aggregateRating' => [
'@type' => 'AggregateRating',
'ratingValue' => $rating,
'reviewCount' => $count,
'bestRating' => 10,
],
];
echo '<script type="application/ld+json">' . wp_json_encode( $data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES ) . '</script>';
} );
注意这里用的是 10 分制(bestRating 必须为 10,与 ratingValue 的量纲一致);如果你用 5 分制,两个地方都要改,写错会导致富媒体测试工具报 “invalid value”。
步骤 4:与已存在的 schema 去重。 装了 Yoast/Rank Math 时,它们会输出 WebPage、Article 等基础图形。此时你的自输出 Review 图形要与它们合并到 @graph 或者独立放置即可——多个 <script type="application/ld+json"> 块并存是合法的,不必强行合并。
步骤 5:借 Rank Math 的过滤器扩展现有输出。 Rank Math 提供了 rank_math/json_ld 过滤器(官方确实提供),可以直接 append 节点:
add_filter( 'rank_math/json_ld', function ( $data, $jsonld ) {
if ( isset( $data['@type'] ) && 'Article' === $data['@type'] ) {
$data['review'] = [
'@type' => 'Review',
'reviewRating' => [ '@type' => 'Rating', 'ratingValue' => 8.5, 'bestRating' => 10 ],
'author' => [ '@type' => 'Person', 'name' => '编辑部' ],
];
}
return $data;
}, 10, 2 );
步骤 6:验证与监控。 用 Rich Results Test 与 Google Search Console 的「增强品牌](xxx)」报告双验证,同时在样式上保证页面本来就有可见星级,避免两者不一致。WordPress 评测站搭建与评分体系
常见踩坑
bestRating写了 5 而ratingValue给了 8.5,检测工具直接报非法值。- 案例: 某站给所有商品统一写
"ratingValue": 4.9, "reviewCount": 2000(虚构数据),被 Google 判定为操纵结构化数据,手动处置后整站富媒体结果消失超过半年。 - 给 LocalBusiness 标注自己给自己打的满分,属于 self-serving reviews,明确违规。
- 多个 SEO 插件同时输出 Product 图形且内容冲突,检测结果出现
Duplicate field。 - 用了 WordPress 自带的星星自定义字段,但未输出任何可见星级,与页面内容不匹配。
JSON_UNESCAPED_UNICODE未加,中文被转义成\uXXXX虽然合法但可读性差;更重要的是没有wp_json_encode而用了json_encode导致特殊字符意外逃逸。- 把 Review 类型直接标给首页这个整体,Google 并不支持这类用法。WordPress JSON-LD 与 Search Console 验证
总结
结构化数据的判断标准是三条:类型与页面主体匹配、数值与真实数据一致、页面本身可见相同内容。行动清单:确认自己不自评分 → 选一种实现方式(手写或插件)→ 统一分制 → Rich Results Test 验过 → 每月看 Search Console 的「星级评价」增强报告。宁缺毋错,不标注只是没有星标,瞎标注会丢掉整个站的富媒体资格。
