跳至正文
Shopify · Google SEO

Shopify 币种与价格展示:别让比价参数变成重复页面

// / / 光算科技

币种切换做得对不对,一步就能看出来:换一个币种,看地址栏变没变。地址不变、价格变,说明币种是展示层的事,站内只有一个 URL,没有重复问题;地址变了或者多出一条路径,你就多了一份内容相同、价格不同的页面,接下来要处理的是重复,跟翻译无关。

结论先给:只影响展示的币种和比价参数,不应该生成可抓取的独立页面。Google 的规范化文档 把排序、筛选这类站点功能产生的 URL 列为重复内容的常见来源,币种参数属于同一类。这类 URL 一旦放开抓取,直接的后果是同一件商品以多个版本出现在搜索结果里,而 Google 用来评估内容的主版本是你没法直接控制的那一个。

三种实现方式,抓取上的差别很大

平台这一层是 Shopify Markets:它按位置、客户分组等条件圈定受众,用 customizations 覆盖店铺默认设置,可覆盖的项里就有币种和定价。不同市场看到不同币种是平台功能,不是主题自己算出来的数,所以排查时先确认这是哪一层在起作用。

参数的三类处置:一刀切删除会破坏购买路径

一刀切删除会破坏购买路径(光算 · 示意图)

前台实现大致三种,抓取行为依次变重。

  1. 会话或 cookie 决定币种,URL 不变。抓取器看到的通常是默认币种,站点只有一个地址,重复风险最小。代价是页面上显示的价格和结构化数据里的价格要能对得上,并且要确认首屏不会被后续脚本二次改写,否则价格从美元符号变成欧元符号会引起布局跳动。
  2. URL 携带币种参数,例如 ?currency=EUR。每个币种一份 HTML,很容易被判为重复,需要明确 canonical 指向不带参数的版本,并确认抓取器不需要遍历这些变体。
  3. 按地区使用独立域名或子域。这属于国际域名方案,是最重的一种:按 sitemap 文档的说明,每个域名都会生成自己的 sitemap,都要单独在 Search Console 验证和提交,除非重定向到主域名,否则都可能被搜索引擎发现。只有确实需要地区化运营时才值得这么做。

还有第四种做法:用户一进站就按 IP 自动切换币种,甚至自动跳到另一个地址。它对转化可能有帮助,对抓取不友好——抓取器从不同位置请求同一个 URL 可能拿到不同内容,缓存层也容易缓存错版本。Google 在讲本地化版本时专门提到,对语言与国家选择器、以及会自动重定向的首页,建议准备一个兜底页面,说明它对这类自动行为是有预期的;但兜底必须是一个真实存在、可访问的地址,不能又是另一次跳转。

参数分三类处理,别一刀切

参数类型典型例子建议处理判断依据
购买路径参数变体参数、集合筛选、分页保留并允许抓取砍掉会打断真实用户的购买路径
展示与跟踪参数币种、货币换算、utm、排序合并到无参数版本同一内容,不该有第二个搜索结果入口
会话状态参数币种记忆、测试分组不进 URL,用会话或 cookie没有独立内容,没有抓取价值

判断标准可以简化成一句:这个 URL 有没有可能成为某个人在搜索结果里的入口。不可能的就不该被抓,也不该出现在内链里。要留意的是合并方式,canonical 只能表达倾向,Google 会综合协议、重定向、sitemap 等信号自己选代表 URL,你声明的那一版它有权不采纳。

广告投放用的落地参数不属于上面任何一类,单独说一句。带参数的投放链接存在的理由通常是衡量效果,它本来就不该被自然搜索结果发现,所以处理方式是尽量让投放落在规范的页面地址上,而不是让一批带参数的地址长期存活。判断这类 URL 时问自己:它存在的理由是衡量投放,还是让人找到内容?答案是前者的,就别指望它同时承担自然搜索入口的角色。

还有一个常见动作要拦住:用 robots.txt 去清理已经出现的参数 URL。Google 的 robots.txt 说明 里写得很清楚,被 Disallow 的 URL 如果被别处链接,仍然可能以没有描述的条目出现在搜索结果里,而且被拦截的页面不会执行脚本,前台如果靠 JavaScript 处理币种,抓取器看到的东西会变得更少。屏蔽是最后手段,不是清理工具。先确定哪些参数确实不该被抓,再决定用 canonical、跳转还是不生成链接。集合页与排序参数的具体排查可以参照老文里那套按 URL 状态逐项对照的做法:一排序就丢筛选时按 URL 状态排查

价格显示和结构化数据必须说同一件事

Shopify 主题自带微数据,产品页上的价格、库存、评价都在里面,官方帮助文档 说明了这一点,并说主题商店里的主题默认包含这类标记。也就是说你不需要从零写结构化数据,但需要核对它和页面显示的内容是否一致。

价格口径一致性:三处对齐,比改标注更重要

三处对齐,比改标注更重要(光算 · 示意图)

Google 的产品结构化数据文档 把它分两类:不能直接购买的页面用产品摘要那套标记,能下单购买的页面用商家信息那套标记,后者对运费、退货政策、尺码等字段支持更细。文档还提到,页面上的结构化数据和 Merchant Center 的商品 feed 同时提供能最大化获得展示的机会,某些体验在页面上缺少价格时会用 feed 里的价格。这几处一旦口径不一,最终摆在用户面前的数字可能不是你预期的那个。

跨境买家关心的从来不是商品页顶上那个数字,而是到手价:币种、税费、运费加起来是多少,退货怎么算。这些信息在结构化数据里有对应的位置可以标,也是购物广告与免费商品信息核对时的重点,做得不严谨的店铺经常在这里被退回修改,我们在做 谷歌广告 的账户诊断时,Merchant Center 的 feed 与页面结构化数据对不齐是出现频率最高的几类问题之一。另外要注意,Google 展示的价格降幅是它自己观察产品历史价格算出来的,不保证展示,别把频繁调价当成获取展示的手段。

汇率换算还带来一个纯工程问题:换算后的数字要四舍五入,不同页面如果用了不同的换算规则,产品页、集合页的价格区间、购物车里的数字就会各说各话。稳妥的做法是让换算只在一个地方发生,而不是在每个 section 里各算一遍;改完之后至少核对三种页面,产品页、集合页、加购之后的购物车,看看同一个商品的价格是不是同一个数。这类不一致用户一眼就能看出来,比搜索排名掉几位更伤转化。

一次核对的具体动作

  1. 打开一个主力产品页,查看渲染后的源码,记录 canonical 指向、结构化数据里的价格、币种、库存三个字段的值。
  2. 切换一次币种,看地址栏是否变化;再对比页面显示的价格和结构化数据里的价格是否同时变了。很多实现只改了可见文本,标记还停在原币种。
  3. 用一个带币种参数和 utm 参数的地址访问,看服务端是返回 200 还是跳转,canonical 指向哪里。
  4. 在 Search Console 里用网址检查工具抽查几个参数 URL,看 Google 实际选中的 canonical 与你的声明是否一致。
  5. 把结论整理成一张表交给改主题的人:哪些参数保留、哪些合并、哪些不写进链接,附上每一条的理由。
  6. 改完之后重抽一次源码,并在移动端再验一遍。币种选择器在不同断点下的位置不一样,只在桌面端核对容易漏。

做不到的部分

反过来说,有些站点确实可以先不管这件事。整站只以一种币种结算、价格不随地区变化的店,币种参数根本不存在;SKU 极少、只有一条产品路径的小站,重复的风险面也小。值得投入精力的是这两种情况:销售地区超过三个、币种随市场切换;或者页面路径已经出现明显分叉,同一件商品在搜索结果里以两三个地址出现。其余的可以放进待办清单,不必现在动。

  • 不能保证参数 URL 一定不被索引。canonical 是提示,robots.txt 也不是移除工具,已收录的 URL 需要通过别的方式处理。
  • 不能保证 Google 采纳你声明的 canonical。它能做的事是降低被误判的概率,不是关掉这个可能性。
  • 不要一刀切删参数或全部重定向。变体参数和筛选链接是购买路径的一部分,处理前先把已经带来自然流量的参数 URL 列出来,逐个判断,删错一条就是白丢流量。
  • 税费与含税展示口径涉及各市场的法规和你的定价策略,具体怎么显示要以自己的合规要求为准,本文只讨论它对搜索与广告核对的影响。

还有一个容易被忽略的连带影响:多语言站里币种往往和语言绑在一起,语言加币种的组合会把 URL 数量乘起来。币种该不该出现在 URL 里、语言版本之间 canonical 怎么指,这两件事要放在一起定,否则一边在合并、另一边又在生成新的可抓取地址。语言版本的处理顺序写在 多语言重复内容与 canonical 的处理 里,URL 形态本身由 Markets 设置决定,见 Markets 与 hreflang 的 URL 对齐。价格标记的具体字段核对,另有 产品结构化数据核对变体与 Offer 的写法 两篇可以接着看。