搜索全站
建站 11 分钟阅读

WordPress 评分结构化数据正确写法:AggregateRating 与 Review 标注

星标出来了,然后又没了?本文讲清 schema.org 里 Review 与 AggregateRating 的适用场景、必填字段、以及 WordPress 里手写 JSON-LD 与借助插件过滤器的两种实现方式,附上不会踩雷的标注清单。

U
UFO_PF 2019-12-02 · 阅读 11 分钟
Wo 建站
阅读提示
本文约 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 评测站搭建与评分体系

常见踩坑

  1. bestRating 写了 5 而 ratingValue 给了 8.5,检测工具直接报非法值。
  2. 案例: 某站给所有商品统一写 "ratingValue": 4.9, "reviewCount": 2000(虚构数据),被 Google 判定为操纵结构化数据,手动处置后整站富媒体结果消失超过半年。
  3. 给 LocalBusiness 标注自己给自己打的满分,属于 self-serving reviews,明确违规。
  4. 多个 SEO 插件同时输出 Product 图形且内容冲突,检测结果出现 Duplicate field。
  5. 用了 WordPress 自带的星星自定义字段,但未输出任何可见星级,与页面内容不匹配。
  6. JSON_UNESCAPED_UNICODE 未加,中文被转义成 \uXXXX 虽然合法但可读性差;更重要的是没有 wp_json_encode 而用了 json_encode 导致特殊字符意外逃逸。
  7. 把 Review 类型直接标给首页这个整体,Google 并不支持这类用法。WordPress JSON-LD 与 Search Console 验证

总结

结构化数据的判断标准是三条:类型与页面主体匹配、数值与真实数据一致、页面本身可见相同内容。行动清单:确认自己不自评分 → 选一种实现方式(手写或插件)→ 统一分制 → Rich Results Test 验过 → 每月看 Search Console 的「星级评价」增强报告。宁缺毋错,不标注只是没有星标,瞎标注会丢掉整个站的富媒体资格。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。