同款商品的颜色、尺码等变体,应按商品组、具体变体和报价三个层次表达。ProductGroup组织变体,Product描述具体商品,Offer描述相应报价。不能因为页面显示“某价格起”,就用AggregateOffer代替变体模型。
这几个类型分别描述什么
| 类型 | 适合表达 | 不要混淆 |
|---|---|---|
| ProductGroup | 同款商品的共同属性与变体关系 | 不是一个可以直接替代所有具体商品的报价 |
| Product | 具体商品或具体变体 | 应保留能区分规格的名称与属性 |
| Offer | 对应商品的报价、币种、可用性和购买URL | 不是整店平均价或划线参考价 |
| AggregateOffer | 多个报价的聚合,例如不同商家售卖同一商品 | Google明确不用于描述一组产品变体 |
Google变体指南使用variesBy、hasVariant及productGroupID等属性组织关系。产品摘要中的AggregateOffer说明明确排除用它表示变体;“前台是价格区间”不是改变这一含义的条件。

一个带条件的JSON教学例子
下面假设一家虚构店铺的同款短袖衫只有两个变体:蓝色M可售,29.90 USD;白色L缺货,页面仍显示32.00 USD。两条URL都能预选正确规格;商品组采用同一个主页面。所有名称、SKU、价格、图片和example.com地址均为教学值,不能原样部署,也不是Google富媒体结果测试通过证明。
| 虚构变体 | SKU | 价格与币种 | 可用性 |
|---|---|---|---|
| 蓝色M | SAMPLE-BLUE-M | 29.90 USD | InStock |
| 白色L | SAMPLE-WHITE-L | 32.00 USD | OutOfStock |
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"name": "示例短袖衫",
"productGroupID": "SAMPLE-SHIRT",
"variesBy": [
"https://schema.org/color",
"https://schema.org/size"
],
"hasVariant": [
{
"@type": "Product",
"name": "示例短袖衫—蓝色M",
"sku": "SAMPLE-BLUE-M",
"color": "Blue",
"size": "M",
"image": "https://example.com/images/blue-m.jpg",
"url": "https://example.com/products/shirt?variant=1001",
"offers": {
"@type": "Offer",
"url": "https://example.com/products/shirt?variant=1001",
"price": "29.90",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
},
{
"@type": "Product",
"name": "示例短袖衫—白色L",
"sku": "SAMPLE-WHITE-L",
"color": "White",
"size": "L",
"image": "https://example.com/images/white-l.jpg",
"url": "https://example.com/products/shirt?variant=1002",
"offers": {
"@type": "Offer",
"url": "https://example.com/products/shirt?variant=1002",
"price": "32.00",
"priceCurrency": "USD",
"availability": "https://schema.org/OutOfStock"
}
}
]
}
缺货不意味着价格必须删除:这里的价格仍由可见页面支持,可用性明确为OutOfStock。真实店铺应按页面、购买方式和目标展示要求处理,不把“库存数量为0”直接等同于所有业务情形的缺货。预售、延期交货和可继续销售要核各自事实。
这是关系教学例子,未包含所有可能适用的品牌、GTIN、配送、退货或服饰属性。正式实现必须用真实资料补齐适用要求,不能编GTIN或评分来消除提示。JSON应由可靠序列化生成,避免商品名中的引号破坏代码。
单页与多页的规范地址规则不同
单页承载整个商品组时,Google变体指南要求该组有一个明确的canonical,通常是未预选变体的基础商品URL;同时要能通过不同URL直接预选每个变体,并显示正确图片、价格、可用性及加购对象。
多个同等重要页面承载不同变体时,不能再要求全组必须只有一个canonical。每个页面都要提供能独立理解的完整实体标记,不能依赖读取另一个页面才补齐当前实体。是否建立独立内容页要看真实用途,但这与用URL预选变体是两个决定。
在Shopify里,先核已有输出再选择修改方式
当前Shopify structured_data过滤器说明无变体产品输出Product,有一个或多个变体时输出ProductGroup。实际店铺可能使用不同主题、应用或定制代码;先看最终输出与版本,不要直接复制新代码叠到现有标记上。
逐个打开代表性的变体URL,确认无需先点击才能选中目标规格,再比较原始HTML、渲染后DOM及对应标记。查看源代码通常反映请求时的HTML,不会自动代表后来点击产生的DOM变化;检查工具也不等于真实加购测试。
Google建议希望覆盖各类购物展示的商家将Product数据放在初始HTML;动态生成并非绝对不可用,但对快速变化的价格和库存,购物抓取可能更不频繁或不可靠。要核资源与输出,而不是用一句“JS都抓不到”代替诊断。
发布前至少把这些不同状态走通
- 同款不同规格:URL、图片、名称、SKU和Offer是否各自对应。
- 售价与促销:当前售价没有被划线价替代,促销结束后能更新。
- 缺货、预售或延期交货:页面、标记与实际购买能力相符。
- 不同市场:使用实际市场URL和币种,不靠手算汇率补字段。
- 主题或应用修改:旧输出及缓存已核,不以增加第二份代码掩盖冲突。
全字段检查见产品数据核对,Feed的变体对应见商品Feed排查,报告观察见富媒体结果监测。技术表达正确只是完成相应准备,不能保证索引、排名或富媒体展示。