其实不是。 谷歌看一个产品页,看到的是一大堆 HTML 代码。它得费力地从一堆标签里,猜出"哪串文字是产品名、哪个数字是价格、哪张图是主图、还有没有货"。
猜,就容易猜错。 结果就是:你明明有价格、有库存、有品牌,谷歌却可能漏掉、认错,白白错过富结果(搜索里带价格、带库存状态的那种展示)。
而结构化数据(Structured Data),就是帮谷歌"不用猜"的东西——你用一段 Product JSON-LD,明明白白告诉它:"这是我的产品名、这是我的价格、这是我的库存。"
这篇文章,就教你在 Shopify 里手改产品模板,给产品页加一段 Product JSON-LD,让谷歌一眼看懂你卖的是什么。
(先说清楚:这篇文章的代码,是按真实店铺里能跑通的标准写的,不给你"看起来对、一贴就报错"的伪代码。下面会重点提醒几个最容易踩的坑。)
一、先搞懂:什么是结构化数据,Shopify 里为什么还要手动改
结构化数据,简单说就是**"给网页内容贴标签"**——用一段机器能直接读懂的代码,标明"这是产品、这是价格、这是库存"。
它用的是 Schema.org 这套标准词汇。产品页用的,就是 Product 这个类型。加一段 Product 结构化数据,谷歌就能准确地展示你的价格、库存、品牌,搜索结果里有机会出现富结果,比干巴巴的文字链接更抓眼。
你可能会问:"Shopify 主题不是自带结构化数据吗,干嘛还要手动改?"
对,主流主题(比如 Dawn)本身就内置了 Product JSON-LD,已经含了 name、image、sku、brand、offers 这些字段。所以你的正确姿势,不是"再加一段",而是:
💡 先在主题代码里搜
@type": "Product",看看主题已经给你输出了什么。 已经有的,就直接改它;没有、或者字段不全的,才自己加一段。千万别无脑再贴一段——那样页面上会出现两个 Product 实体,谷歌只认其一,字段一冲突就直接报错。
这是全文最重要的一条原则,先记住:改,而不是叠。
二、Product JSON-LD 长什么样:一份能直接套的模板
先给你看一段完整的 Product JSON-LD 结构(字段都是 Schema.org 官方标准),你就知道要写什么了:
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "不锈钢餐具四件套",
"image": "https://你的域名.com/产品图.jpg",
"description": "18/10 食品级不锈钢餐具四件套,耐腐蚀不生锈。",
"sku": "CUTLERY-4PCS",
"brand": {
"@type": "Brand",
"name": "你的品牌名"
},
"offers": {
"@type": "Offer",
"price": 29.99,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://你的域名.com/products/产品"
}
}
</script>
几个核心字段,一眼看懂它们各管什么:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
📊 重点看 offers 这个"报价"对象——它告诉谷歌"这个产品卖多少钱、用什么币、有没有货"。注意上面
price我写的是29.99(数字),不是"29.99"(带引号的字符串),这个区别,下一节就是坑。
三、手改模板:用 Liquid 变量让数据"自动填"
上面那份模板,字段值是写死的。但你的店里有几百上千个产品,不可能一个个手填——得用 Shopify 的 Liquid 变量,让每个产品页自动填入自己的数据。
第一步(关键前置动作):先在主题代码里搜 @type": "Product"。 在后台的「在线商店 → 主题 → 编辑代码」里,找到产品模板文件(新版 OS 2.0 主题是 sections/main-product.liquid,旧主题是 sections/product-template.liquid 或 templates/product.liquid),先搜一下有没有已经内置的 Product JSON-LD。
<script type="application/ld+json">{ "@context": "https://schema.org/", "@type": "Product", "name": {{ product.title | json }}, "image": {{ product.featured_image | image_url: width: 1200 | json }}, "description": {{ product.description | strip_html | json }}, "sku": {{ product.selected_or_first_available_variant.sku | json }}, "brand": { "@type": "Brand", "name": {{ product.vendor | json }} }, "offers": { "@type": "Offer", "price": {{ product.selected_or_first_available_variant.price | divided_by: 100.0 }}, "priceCurrency": {{ cart.currency.iso_code | json }}, "availability": {% if product.selected_or_first_available_variant.available %}"https://schema.org/InStock"{% else %}"https://schema.org/OutOfStock"{% endif %}, "url": {{ request.origin | append: product.url | json }} }}</script>
几个变量,说清它们各取什么、为什么这么写:
① 价格 divided_by: 100.0 ——这是全文最大的坑,单独说。
Shopify 在后台存价格,存的是**"分"这个整数**:卖 29.99,存的是 2999。所以你要除以 100,才能得到真正的十进制数字 29.99,给谷歌读。
🔴 千万别用
money_without_currency这个 filter 去"去掉货币符号"。 它只去符号,却会保留千分位逗号和本地化格式——美元站$1,299.00会变成1,299.00,谷歌直接报错(price 里不该有逗号);欧元站更惨,千分位和小数点还是反的,谷歌完全读不懂。money_without_currency不是解药,是另一个坑。 正确做法就是divided_by: 100.0(或 Shopify 官方的money_amountfilter),输出干净的纯数字。
② 图片 image_url: width: 1200,不要自己拼域名。
image_url 会直接返回完整的 https 图片地址,不用你再去拼域名。千万别用老写法 img_url + prepend: request.origin——img_url 返回的是协议相对路径 //cdn.shopify.com/...,你往前拼域名会得到 https://你的域名.com//cdn.shopify.com/... 这种废地址,谷歌抓不到主图。(而且 img_url 早就被 image_url 取代了。)
③ 库存用 selected_or_first_available_variant.available,别用 product.available。
product.available 是产品级的字段——只要任意一个变体有货,它就返回 true。多变体商品会出现"这个尺码明明缺货,schema 还写 InStock"的错。 所以用当前选中的那个变体的 available,才准确。
④ 品牌用 product.vendor(品牌/厂商名)、SKU 用变体的 sku、描述用 strip_html 去掉 HTML 标签只要纯文字、币种用 cart.currency.iso_code。
⚠️ 再补一个多变体的提醒:这段代码是"服务端渲染"的,只输出默认(或当前)变体的价格。 用户点选其他尺码/颜色时,页面上显示的价格会变,但这段 JSON-LD 不会跟着更新——可能出现"页面显示价 ≠ schema 价"的不匹配。多变体商品,最规范的做法是输出多个 Offer(或 ProductGroup),这个进阶内容放下一节。
四、改完怎么验证:用谷歌的免费工具测一遍
改完代码、保存,别急着收工——得先验证一下你写的对不对。
用谷歌官方的 Rich Results Test(富结果测试),把你的产品页网址贴进去,它会告诉你:
💡 验证通过,说明谷歌能正确读懂你的产品页了。之后等谷歌重新爬取(可以在 Search Console 里手动"请求编入索引"加速),你就有机会看到带价格、带库存的产品富结果。
五、几个低成本高价值的字段,顺手补上
上面那套是"保底"的。下面几个字段,加几行代码就有增量价值,值得补:
① itemCondition——产品是全新还是二手。
"itemCondition": "https://schema.org/NewCondition",
② gtin——商品条码(Shopify 后台有现成的 barcode 字段)。
有条码的,加上 gtin 让谷歌更好地识别你的商品。用产品的 barcode:
"gtin13": {{ product.selected_or_first_available_variant.barcode | json }},
③ 多张图——image 字段可以是数组,不只主图一张。
主图、细节图、场景图都放进去,谷歌能更完整地理解这个产品。
📊 另外提醒一个"照做了却还没富结果"的真相:上面这套,对"产品摘要"(搜索结果里带价格、库存的那种)基本够用;但如果你想进"商家列表"(购物轮播那类更靠前、更抓眼的展示),谷歌还有额外要求——比如要提供
shippingDetails(配送信息)和hasMerchantReturnPolicy(退货政策)。那套更复杂,先把上面这套基础打牢、验证通过,再谈进阶。
六、一个必须知道的"红线":评分别造假
最后,特别提醒一个绝不能碰的坑——评分(aggregateRating / review)字段,不能自己编。
谷歌对"产品评分/评论"结构化数据有严格规定:你标注的评分和评论,必须来自真实、独立的用户评价。 自己凭空填一个"4.9 分、几百条评论",属于违规(谷歌叫它"自卖自夸式评论"),轻则富结果不展示,重则被谷歌人工处理、处罚。
所以:
🔴 记住这句:结构化数据是"如实标注",不是"美化包装"。 你能加价格、库存、品牌这些客观事实;但评分这种"用户生成"的东西,没有真实的就别碰。
写在最后
回到标题:Shopify 产品页想被谷歌"读懂",光有内容不够——手改产品模板加一段 Product JSON-LD,让谷歌一眼看懂你卖的是什么。
这篇文章,想帮你补上产品页"让谷歌读懂"的技术一环。
把这篇压成三步带走:
① 先搜后改——在主题代码里搜 @type": "Product",已有就改、没有再加,别无脑叠两段;
② 改对三个坑——价格用 divided_by: 100.0(别用 money_without_currency)、图片用 image_url(别自己拼域名)、库存用变体的 available(别用产品级的);
③ 验证 + 补全——用 Rich Results Test 测一遍,再补 itemCondition、gtin、多图这些增量字段。
产品页要排上去、要出富结果,光靠内容"堆"是不够的。 谷歌得先"读懂"你这页到底卖什么、多少钱、有没有货,才谈得上给你排名、给你好看的展示。花十分钟,改对一段 Product JSON-LD,让谷歌一眼看懂你的产品——这一步,是产品页从"能看见"到"能被推荐"的关键一跳。但记住:代码要"改对",不是"贴上就行"。 那几个坑,踩一个,前面的功夫就白费了。
#Shopify #结构化数据 #JSON-LD #Product #Schema #产品页 #独立站SEO
本篇完整干货已全部分享完毕,既然你已经看完
这份《SEO+GEO实战清单》
直接送给你,希望能帮你少走弯路!
需要的朋友我统一发给
📖 立即领取学习包 →
(同步设有谷歌 SEO 同行交流社群,有交流需求可私信【社群】领取入群渠道)
这里就不方便放图片展示了.....
请记住这个:

