跳至正文
Shopify · Google SEO

Shopify变体结构化数据:ProductGroup、Product与Offer怎么用

// / / 光算科技

同款商品的颜色、尺码等变体,应按商品组、具体变体和报价三个层次表达。ProductGroup组织变体,Product描述具体商品,Offer描述相应报价。不能因为页面显示“某价格起”,就用AggregateOffer代替变体模型。

这几个类型分别描述什么

类型适合表达不要混淆
ProductGroup同款商品的共同属性与变体关系不是一个可以直接替代所有具体商品的报价
Product具体商品或具体变体应保留能区分规格的名称与属性
Offer对应商品的报价、币种、可用性和购买URL不是整店平均价或划线参考价
AggregateOffer多个报价的聚合,例如不同商家售卖同一商品Google明确不用于描述一组产品变体

Google变体指南使用variesBy、hasVariant及productGroupID等属性组织关系。产品摘要中的AggregateOffer说明明确排除用它表示变体;“前台是价格区间”不是改变这一含义的条件。

衣架上并列蓝色M码和白色L码短袖衫,标为同一个虚构商品组的两个变体
AI辅助原创服装陈列,用于说明同款商品与颜色尺码的关系;不是实物、库存截图或销量数据,图中轮廓不按实际尺寸比例。

一个带条件的JSON教学例子

下面假设一家虚构店铺的同款短袖衫只有两个变体:蓝色M可售,29.90 USD;白色L缺货,页面仍显示32.00 USD。两条URL都能预选正确规格;商品组采用同一个主页面。所有名称、SKU、价格、图片和example.com地址均为教学值,不能原样部署,也不是Google富媒体结果测试通过证明。

虚构变体SKU价格与币种可用性
蓝色MSAMPLE-BLUE-M29.90 USDInStock
白色LSAMPLE-WHITE-L32.00 USDOutOfStock
{
  "@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排查,报告观察见富媒体结果监测。技术表达正确只是完成相应准备,不能保证索引、排名或富媒体展示。