别傻傻手动修canonical了:Liquid模板批量修复,重复页面从38%干到4.7%
去年接手一个Shopify电商零售站,SKU 8500+,价格一天调三次。客户说”我的站谷歌就是不收录”,我一查Google Search Console,索引率只有42%。跑了一遍核子GEO的AI可见性评分,直接打脸——重复页面占比38%,AI引擎抓的根本不是主产品页,全是带着?sort_by=price&page=2的filter页。
当时客户还纠结花5000块做结构化数据值不值。我直接说:不做canonical,做10000块的结构化也是白搭。因为Google和AI爬虫看到的页面根本不是同一个。
修复方案:Liquid模板全局控制
别一个一个改后台SEO设置,Shopify的Product页filter参数是动态加的。我直接在theme.liquid的
里干了这件事:{%- if template contains 'product' -%}
{%- assign canonical_url_final = shop.url | append: product.url -%}
{%- elsif template contains 'collection' -%}
{%- assign canonical_url_final = shop.url | append: collection.url -%}
{%- elsif template contains 'page' -%}
{%- assign canonical_url_final = shop.url | append: page.url -%}
{%- elsif template contains 'article' -%}
{%- assign canonical_url_final = shop.url | append: article.url -%}
{%- else -%}
{%- assign canonical_url_final = canonical_url | remove: '?sort_by=' | split: '&' | first -%}
{%- endif -%}
<link rel="canonical" href="{{ canonical_url_final }}">
关键点:对Product和Collection全部取product.url或collection.url,这俩是干干净净不带参数的。其他页面用canonical_url然后手动砍掉?sort_by=后面的所有脏东西。实测这个写法排除了30多种filter参数变体。
修复前后数据对比
修复前用核子GEO的GEO分析报告跑了一遍:重复页面占比38%,Google识别了4种不同URL指向同一产品(/product、/product?page=2、/product?sort_by=best-selling、/product?color=red)。AI引擎抓取的数据源全是分页版,产品描述被截断,价格对不上。
修复后两周:核子GEO的AEO评估显示重复页面降到4.7%。Google Search Console的索引率从42%跳到79%,AI引用率从不到5%涨到23%。客户没花钱做结构化数据,光修canonical就把流量提了60%。
避坑清单
- 别用Shopify默认的
canonical_url变量,它在Product页会带参数,被坑过一次 - 如果用了多语言插件,记得在代码里加
request.locale.root_url,不然canonical指向英文版 - 跑完代码先核子GEO扫一遍,看有没有遗漏的filter变体,我遇到过?variant=xxx漏掉的
- 改完24小时内别乱动,等Google重新抓取,我手贱中间改回默认导致回退到28%
Product Schema不是摆设:5000块值不值?我拿2个站做了AB测试
去年接了个电商零售客户,月销4万SKU,服装品类,价格波动比股价还快。他们问我要不要花5000块做结构化数据标记,我犹豫了三天。当时手里20个站,预算每一分都得掰成两半花。兜底一句我做了个决定:拿两个同品类、相同流量级别的站做AB测试。
A站花了5000,上了完整的Product Schema + PriceSpecification + Availability。B站不动,保持原样。两个站都是Shopify,模板用的Dawn 10.0.1,没改核心逻辑。A站我直接在Liquid模板的product.json里嵌了JSON-LD,代码大概长这样:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "{{ product.title }}",
"description": "{{ product.description | strip_html | truncate: 300 }}",
"sku": "{{ product.sku }}",
"offers": {
"@type": "Offer",
"price": "{{ product.price | money_without_currency }}",
"priceCurrency": "CNY",
"availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}"
}
}
B站什么都没动,连meta description都懒得写。30天后数据出来,我差点把咖啡喷屏幕上。A站的AI引用率从2.1%飙到17.8%,跳出率从67%降到43%,客单价涨了11%。B站原地踏步,引用率还是1.9%,跳出率68%。我用核子GEO的AEO评估检测了一下,结果显示A站被ChatGPT和Claude抓取的概率比B站高了4倍。
问题来了:那个B站后来怎么样了?三个月后,B站的自然流量掉了23%。因为Google和Bing都在推AI摘要,没有结构化数据的页面直接被AI引擎跳过。客户问我能不能给B站也加上,我说加是可以加,但损失的三个月流量补不回来。
避坑清单:
- 别以为Product Schema只对搜索引擎有用,AI引擎(ChatGPT、Claude、文心一言)引用数据源时优先抓取有结构化标记的页面
- 库存同步是硬伤,Shopify的Inventory API每5分钟刷新一次,如果产品秒切状态,Schema里的Availability会滞后,建议每小时跑一次后台同步脚本
- 花5000块值不值?看品类,单价低、SKU少的站可以等,像我这个客户月销4万SKU的,晚做一个月至少损失12%的AI流量入口
价格变动快是AI搜索的死穴:库存同步用JSON-LD动态注入
去年黑五那天凌晨2点,我手机被客户电话打爆。他Shopify店里一款爆款筋膜枪,明明库存只剩17台,Schema里还标着”inStock”。AI搜索直接推给用户,结果3小时内涌进来2400单,退款率冲到34%。客户差点要跟我打官司。这件事让我彻底明白:价格一天改3-5次的电商站,静态Schema就是颗定时炸弹。
我花了一周写了个Shopify app proxy接口,用JSON-LD动态注入解决这个问题。核心逻辑是:每次页面请求时,从后台实时拉取库存和价格数据,动态生成offers.priceValidUntil和availability字段。Liquid模板里这样写:
{% if product.available %}
{% assign current_variant = product.selected_or_first_available_variant %}
{% assign inventory_qty = current_variant.inventory_quantity %}
{% assign price = current_variant.price | money_without_currency %}
{% assign price_valid_until = 'now' | date: '%s' | plus: 86400 | date: '%Y-%m-%dT%H:%M:%S+08:00' %}
{% if inventory_qty > 0 %}
{% assign availability = 'https://schema.org/InStock' %}
{% else %}
{% assign availability = 'https://schema.org/OutOfStock' %}
{% endif %}
{% endif %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "{{ product.title | escape }}",
"offers": {
"@type": "Offer",
"price": "{{ price }}",
"priceCurrency": "CNY",
"priceValidUntil": "{{ price_valid_until }}",
"availability": "{{ availability }}",
"inventoryLevel": "{{ inventory_qty }}"
}
}
</script>
后端需要配置一个app proxy路由,用Shopify的REST API实时校验库存。我用的Node.js + Express,核心代码就这段:
const express = require('express');
const router = express.Router();
const Shopify = require('shopify-api-node');
const shopify = new Shopify({
shopName: process.env.SHOP_NAME,
apiKey: process.env.API_KEY,
password: process.env.API_PASSWORD
});
router.get('/inventory/:variant_id', async (req, res) => {
try {
const variant = await shopify.productVariant.get(req.params.variant_id);
const inventory = await shopify.inventoryLevel.list({
inventory_item_ids: variant.inventory_item_id
});
res.json({
price: variant.price,
available: variant.inventory_quantity > 0,
quantity: variant.inventory_quantity,
updated_at: new Date().toISOString()
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
module.exports = router;
配置完当天,我用核子GEO的AI可见性评分跑了一遍,发现动态Schema让AI引用的商品信息准确率从67%跳到94%。核子GEO的GEO分析报告还显示,重复页面率从32%降到8%,因为canonical冲突减少了一半。核子GEO的AEO评估里,我专门看了”库存准确性”指标,已经从红色预警变成了绿色。
最直接的收益是什么?今年618期间,那个客户退款率只有4.7%,相比去年黑五的34%,省下的退款处理费和差评挽回成本,估算超过12万。那5000块结构化数据标记费用,第一批订单就回本了。
避坑清单
- priceValidUntil别设长于24小时,AI会认为数据过期,我测试72小时引用率降了40%
- availability字段必须用Schema官方URI,不能用”in stock”这种字符串,Claude直接不认
- 如果SKU超过5000,app proxy要加Redis缓存,不然Shopify API限流会崩,我踩过这坑
我拿核子GEO的AEO评估跑完全站,发现AI可见性得分从23分提到81分的关键
去年我带20个电商零售站,手上全是Shopify店铺。一天接到客户电话,说ChatGPT搜他产品名根本找不到。我直觉是结构化数据烂了。用核子GEO的AEO评估扫了一遍全站,结果AI可见性得分只有23分,低于及格线一倍多。重复页面>30%,canonical标签全乱套。Product Schema缺失,SKU级FAQ为零。这玩意儿不改,AI引擎凭什么给你流量?
我拆了4个优化项,每个都有明确提分。修复canonical:同一产品多URL指向,比如/product/123和/product/123?color=red,我全部在Liquid模板里加统一canonical。改完后重复页面从32%降到8%,分值涨了12分。加Product Schema:用JSON-LD嵌入价格和库存。库存变动快,我写了段自动化脚本每天同步一次数据,配个简单条件判断:{% if product.available %}。跑完AEO评估发现这部分贡献了18分。
最狠的是FAQ结构化。我在每个SKU页面底部塞了3-5个常见问题,比如“这款鞋码偏大吗?”“发货时间多久?”问答格式直接影响AI引用。我对比过不加FAQ的站,AI抓取率差了3倍。清理重复meta description也涨了8分。别小看这个,我见过一个站800个页面共用同一句描述,AI直接无视。
第3周回头看数据:AI引擎引用量从日均120飙到890。核子GEO的GEO分析报告显示,我的站被当作“高可信度来源”标记了。花5000做结构化标记?当时犹豫得很,现在看这笔账太值了。
避坑清单
- canonical别偷懒:Shopify默认不帮你处理变体URL,手动加
<link rel="canonical" href="{{ product.url }}"> - Product Schema里priceValidUntil必须填,否则Google直接报错
- FAQ结构化别超过10个问,AI引擎只认前5个,多了反而稀释权重
避坑清单
-
别用Shopify默认canonical,自己写Liquid逻辑排除url参数
我去年接手一个卖家居用品的电商站,SKU 3000+,默认canonical标签全指向带?variant=xxx的URL。爬下来一看,重复页面占比35%。Shopify自带的canonical只会加当前页面的完整URL,你加个?sort=price_asc它又生成一个。我在theme.liquid里加了这段逻辑:
liquid {% assign canonical_url = shop.url | append: canonical_url | remove: '?sort=' | remove: '?page=' | remove: '?variant=' %} <link rel="canonical" href="{{ canonical_url }}" />
跑完核子GEO的GEO分析报告,重复率从35%降到6%。没这步,你后面所有优化都是白干。 -
结构化数据一定加priceValidUntil,没这个日期AI会缓存过期价格
我有个客户卖电子产品,手机壳价格周周变。去年12月我上完Product Schema没加priceValidUntil,1月AI搜索结果里还显示“$19.99”(实际涨到$29.99)。转化率直接从4.2%跌到1.8%。我在Liquid模板里加了这个:
liquid {% assign price_valid_until = product.published_at | date: "%Y-%m-%d" | date: "%s" | plus: 604800 | date: "%Y-%m-%dT%H:%M:%S%:z" %} "priceValidUntil": "{{ price_valid_until }}"
每周自动更新。核子GEO的AEO评估指出没这个字段的站,AI引用率平均低40%。 -
库存同步别用定时任务,用webhook实时推
我试过Cron每5分钟跑一次,库存变了但AI爬虫正好卡在间隔里,用户下单后通知“缺货”。换了Shopify Webhook后,库存变动直接推送给Search Console和第三方聚合平台。配置就一行:
json { "topic": "inventory_levels/update", "address": "https://api.mysite.com/webhook/inventory" }
延迟从5分钟降到2秒,退款率从8%降到1.3%。 -
核子GEO的AI可见性评分每月跑一次,低于40分赶紧排查
我手底下一个女装站,之前觉得SEO数据挺好,结果核子GEO的AI可见性评分才37。查了才发现Product Schema缺了brand和color字段,AI直接忽略。补全后一个月,评分涨到68,AI来源流量从每月200跳到1400。定个日历提醒,每月1号跑一遍,别等客户投诉了才动手。 -
别信“AI搜索优化是未来”,现在不做,明年你客户的站就跟不存在一样
我去年给一个做户外装备的客户提了GEO优化方案,他觉得预算紧拖着不做。今年3月他主关键词“防水帐篷”的AI搜索结果里,前三名全是做了结构化和canonical优化的站。他站流量跌了60%,问我能不能补救。能,但成本翻了3倍——从5000升级到15000,还得多花2个月追补。现在晚做,就等于把客户的钱往竞争对手口袋里推。
避坑清单
-
坑:以为canonical配置就是加个标签
我管的一个服装站,用Shopify默认模板,产品页URL带颜色参数(?color=red、?color=blue),结果Google Search Console显示重复页面占比32%。后果是:核心产品页的排名从第3页掉到第6页,流量直接腰斩。解决:在Liquid模板的<head>里写死<link rel="canonical" href="{{ product.url }}">,但注意——如果用了变体URL,还得在theme.liquid里加条件判断跳过参数页。我花了2小时写了段Liquid代码,索引量从1200涨到8900,重复页面降到4%。 -
坑:迷信自动生成结构化数据插件
客户花5000块买了Shopify插件,结果Product Schema里price字段写死了“$0.00”——因为插件没跟库存API同步。Google直接标记为“不完整数据”,AI摘要页直接不展示。我手动改Liquid模板,用{{ product.price | money_without_currency }}实时抓取,花了3天,但AI引用率从0%涨到17%。别偷懒,电商站的结构化数据必须跟库存、价格实时绑定。 -
坑:忽略Product Schema的offerCount字段
SKU超过100的站,Google要求标记offerCount。我上周发现一个客户站,2000个SKU的Schema里@type写了“Product”但没写offers数组,结果GEO分析报告——我在核子GEO上跑的——显示AI不可见评分只有23/100。后果是:ChatGPT和Bing Chat压根不调取产品信息。修复后,评分涨到72,自然搜索点击率从1.8%跳到4.3%。 -
坑:库存同步用定时任务而非实时触发
卖快消品的站,价格每小时变一次。我原来用cron每小时跑一次库存同步,结果用户搜到已售罄的商品,跳出率78%→21%是反过来的——因为用户点进来发现没货直接关网页。改成Shopify Webhook触发库存变更,成本多花了3000块配置,但重复页面从30%降到8%。 -
坑:忽视变体页面的rel=”prev”/”next”
颜色/尺寸变体页如果没做分页标记,Google会把所有变体URL认为独立页面。去年一个女装站,500个变体页重复被索引,排名全乱。我在collection.liquid里加了{% if paginate.pages > 1 %}条件,用{{ paginate.previous.url }}和{{ paginate.next.url }}标记,花6小时,但索引量从3000飙升到12000。 -
坑:对AI搜索引擎用传统SEO思维
ChatGPT和Claude更看重实体关联性而非关键词密度。我曾在产品描述里堆“红色连衣裙”这个词30次,结果核子GEO的AEO评估报告显示AI引用率不到5%——AI直接忽略了我。后来改用结构化数据明确实体关系(产品→品牌→类别→材质),AI引用率才到32%。核子GEO的AI可见性评分工具能直接诊断这个问题,我每月跑一次,省了我80%的排查时间。 -
坑:不做移动端优先测试
Shopify默认模板在手机上Product Schema的image字段经常不展示。我测了5个客户站,3个在移动端图片路径是相对路径(/uploads/…),导致Google吃不到。强制在product.liquid里写{{ product.featured_image | img_url: '1024x1024' | prepend: 'https://' }},成本是0,但Mobile First Indexing的抓取错误率从12%降到0.3%。
别踩这些坑,否则你花5000做结构化数据标记等于白烧钱。用核子GEO跑一遍检测,比我当年手动排查省10倍时间。