变体商品的 SEO 问题,根源通常只有一句话:你在用一个 URL 同时表示多个商品。颜色、尺码、材质这类属性一多,同一个商品页就成了"红/大"、"蓝/大"、"红/中"三个不同商品的共同地址,Google 只能按一个页面处理。下面把官方对这件事的原始要求拆成地址层和标记层两半。

官方对变体地址的两种写法
Google 的电商 URL 结构设计指南里有一节专门讲变体。原文的判断是:每个属性组合都算一个变体(product variant),要让 Google 能识别这些变体,前提是每个变体都能由一个单独的 URL 标识出来。官方推荐两种地址形态:路径段,比如 /t-shirt/green;或查询参数,比如 /t-shirt?color=green。同一篇还给出一条容易被跳过的规则:如果你选择用可选查询参数来标识变体,就用去掉该参数的那个 URL 作为规范地址,这样有助于 Google 理解变体之间的关系。配套的一张示意图也是这个意思——不带的那个是 canonical,带参数的那个不是。
这条规范地址规则的底层逻辑,电商 URL 结构指南里也讲到了:内链、站点地图和 canonical 标签要使用同一个 URL,并且在所有可索引页面上放一个指向当前页的自引用 canonical。所以变体页要不要被收录,和它收到的内链指向哪、有没有外链指着它,是两件必须一起看的事,站内canonical 和外链指向的 URL 有什么关系那篇已经拆过信号集中这件事。
哪些变体处理方式官方明确不推荐
同一篇 URL 指南在讲"URL 结构为什么重要"时列了三种典型失败模式,其中两种直接落在变体上:
- 用
#片段区分变体。官方写明 Google 在索引时不用片段标识符,/product/t-shirt#black与/product/t-shirt#white被视为同一个页面。 - 同一份页面挂在两个不同形态的地址上。官方举例
/product/black-t-shirt与/product?sku=1234可能返回同一个商品页,但 Google 无法只从地址判断二者相同,会重复抓取同一份内容,白白消耗抓取预算并加重服务器负担。 - 地址里带会一直变化的值。官方提醒持续变化的值会让爬虫以为站点有无穷多页面,拖慢它找到有用内容的过程。变体如果挂在库存状态或当前时间这类值上,就属于这一类。
标记层要补的两个字段
地址解决了"怎么区分",结构化数据解决"怎么说明它们是一家人"。商家商品列表的字段定义里,Product 类型下有两个相关推荐项:isVariantOf,指向该变体所属的商品组;inProductGroupWithID,给出该变体所属商品组的标识,官方要求最多给一个值。Google 对 Product 结构化数据的说明则直接建议加上变体标记,理由是这能帮助 Google 更好理解哪些商品是同一父商品的变体,而且产品摘要与商家商品列表两种功能都支持变体。
字段含义本身可以在 schema.org 的 Product 词条里查,isVariantOf 指向 ProductGroup。但要分清分工:schema.org 只说明字段是什么,"最多一个值""属于推荐项"这类判断来自 Google 的功能指南,两者不能互相代替。
同时注意商家商品列表的技术条款:商品类富结果只支持聚焦单个商品(或同一商品的多个变体)的页面。也就是说,标注应该加在商品页上,不该加在列出多个商品的分类页上。至于评价与评分字段该怎么在商品页上正确落地,属另一层问题,站内WooCommerce 的产品打分怎么操作有专门说明,本文不重复功能步骤。
在 WordPress 商店上按这个顺序改
实际动手时建议由外到内,一次只改一层,改完就抓一个样本看结果:
- 先定"规范商品页"是哪一个——通常是不带任何属性参数的那个地址。
- 再决定属性用路径段还是查询参数表达,定了之后全站保持一致,含内链与分类页里的链接。
- 然后确认每个变体在商品数据里有各自独立的编码与价格,否则不要拆地址。
- 最后才动标记层,给变体页补商品组标识,并检查有没有和主题重复输出。
- 每改完一层,都要回头确认上线前已经被人分享过的那些带参数地址没有被漏掉——这类历史地址的计数口径站内有专门一篇。
怎么验证变体关系被正确理解
验证分三步,可以拿一个属性维度最多的商品来做样本:
| 验证动作 | 看到什么算通过 | 没通过时先查什么 |
|---|---|---|
| 依次打开该商品各变体地址 | 每个都返回 200,且页面主图、价格、编码与该变体一致 | 变体切换是否只是前端隐藏,没有真的换地址 |
| 看不带参数的地址的 canonical | 指向自己 | SEO 类插件是否把带参数的地址写成了规范地址 |
| 看带参数地址的 canonical | 指向不带参数的那个地址 | 主题有没有在变体页额外输出自引用 canonical |
检查页面上是否出现 rel="canonical" 与结构化数据各一份 | 各自只有一处,值互不矛盾 | 主题与商店组件是否重复输出 |
| 检查结构化数据里变体字段 | 变体页带商品组标识,父商品页不带 | 字段映射是否把父商品的编码误当成商品组标识 |
最后一条要特别提醒:官方没有公布变体数量、属性维度的任何上限,也没有说过"变体超过多少个就不该拆地址"。判断标准应当是每个变体是否有自己的商品编码、自己的价格或库存状态——如果两者完全相同,官方口径下它们本来就该是同一个页面,拆开只会制造重复。