Shopify 主题避坑

变体只有一张图,商品有二十张:按选中变体过滤商品图库

一位用 Horizon 主题的商家问了一个 Shopify 店主问了十年的问题:顾客选黑色,就只该看到黑色的图——不用任何付费 app。24 小时内,这个帖子集齐了这个问题所有经典的错误答案:把布局设置当过滤、把「每色一张主图」当「每色一整套图」、伸手要店铺 URL 的服务推销,以及一份 OP 没能跑起来的可用代码。这篇文章就是那个帖子没等到的答案。

TL;DR:「只显示选中变体的图片」是两个戴着同一个名字的不同问题。案例 A——每个颜色一张代表图——原生免费、任何套餐都行:在商品后台给每个变体指定主图,Horizon 用户再到媒体图库块设置里打开**「选择变体后隐藏其他变体的媒体」**(田野报告,659928 帖三位独立发帖人互证;它只隐藏到「每变体一张指定图」的粒度)。案例 B——每个颜色一整套图——没有任何原生支持:Liquid 里的 product.media 是所有变体共享的一个扁平池子,Horizon 没有任何设置能改变这一点。案例 B 的免费、非 Plus、无 app 路线是 alt 文本标记 + Custom Liquid/JS 过滤;Plus 店用官方 Combined Listings 零代码解决。网格还是轮播是布局选择,从来不是过滤器。

这是我们的 Shopify 主题实战避坑系列第 1 篇。选题证据是一个真实的 Shopify 社区帖子(主题 659928,全文按田野报告标注):24 小时 13 帖,OP 两次追问,没有采纳答案。

问题

2026 年 8 月 2 日,一位商家在 Shopify 官方社区发了一个被问了十年的问题(帖子 659928,Shopify Discussion 版):

我用 Horizon 主题。顾客选黑色,就只该看到黑色的图;选白色,就只该看到白色的图。我不想用任何付费 app,有没有免费的代码或方案?

24 小时内,这个帖子集齐了这个问题所有经典的错误答案:

帖子最终没有采纳答案,OP 依然没有过滤后的图库。还有发帖人贴出另一个 Horizon 并行帖(v4.1.3,不同店铺,同样症状)——这是群体性困惑,不是某个商家倒霉。

根因

混乱的根源在于:Shopify 的数据模型给了你两个看起来很像、实际上完全不同的东西:

  1. 变体可以携带自己的媒体——在 Liquid 里是 variant.featured_image / variant.featured_media,在 Admin GraphQL API 里是 ProductVariant.media。你在商品后台点开某个变体、给它指定图片时,设置的就是它。每个变体只有一张「主图」,主题(包括 Horizon)会在顾客选中该变体时把它换到主图位置。这是原生的、免费的、任何套餐都能用。
  2. 商品的媒体集——Liquid 里的 product.media——是一个被所有变体共享的扁平池子。任何没有指定给某个变体的图片,同时属于所有颜色。数据模型里根本不存在「这五张图属于黑色」这种结构。

所以「只显示选中变体的图片」要拆成两个完全不同的问题:

案例 你想要的 原生支持
A 每个颜色一张代表图,选中时切换 有——变体主图,所有主题都行
B 每个颜色一整套图(3-8 张),选中时过滤 没有——数据模型不支持,Horizon 也没有这个设置

下文全部围绕案例 B。如果你是案例 A,可以停在这里了:在 商品 → 你的商品 → 变体 里给每个变体指定主图;Horizon 用户再到媒体图库块设置里打开**「选择变体后隐藏其他变体的媒体」**即可。(实地报告:659928 帖中三位独立发帖人互证,#10 附截图;注意它只隐藏到「每变体一张指定图」的粒度,管不了多张图。

最小复现

在开发店上五分钟就能复现这个问题:

  1. 建商品「Test Tee」,选项 颜色:值 BlackWhite
  2. 传 6 张图:3 张黑色、3 张白色。把第一张黑图设为 Black 变体主图,第一张白图设为 White 变体主图。
  3. 用 Horizon 发布,商品模板,媒体图库用网格模式(Horizon 默认)。
  4. 前台选 Black:主图切换成黑色图——但其余 5 张(包括全部 3 张白图)依然列在图库里。选 White,反过来同样。

这就是原生行为的天花板。没有任何开关能改变它。

方案

三条路,按「非 Plus、拒绝 app」的商店优先级排序。

路线 1 — Alt 文本标记 + 图库过滤(免费、代码、无 app)

给每张颜色图填 Alt 文本(商品 → 点开图片 → Alt 文本 → 填 BlackWhite……;尺码表这类共用图留空)。然后按当前选中选项值过滤图库。Liquid 部分,放在商品模板的 Custom Liquid 块里:

{% assign current_variant = product.selected_or_first_available_variant %}
{% assign selected_color = current_variant.options.first %}

{% for media in product.media %}
  {% if media.media_type == 'image' %}
    {% if media.alt == blank or media.alt == selected_color %}
      <img
        src="{{ media | image_url: width: 800 }}"
        alt="{{ media.alt | escape }}"
        loading="lazy">
    {% endif %}
  {% endif %}
{% endfor %}

决定这套方案在生产环境成败的细节:

路线 2 — Shopify Combined Listings(免费、官方、仅限 Plus)

如果每个颜色确实值得一整套独立媒体——以及独立 URL(投广告、做 SEO 都要用)——官方答案是 Shopify Combined Listings:每个颜色是独立商品、各有图库,组合 listing 把所有子商品展示在同一个商品页上。零代码。硬门槛:Combined Listings 仅对 Shopify Plus 套餐开放(shopify.dev 官方文档,2026-08-05 核验)。对明确排除了 app 和 Plus 的 OP 来说此路不通——但对 Plus 店这是正确答案,写任何 Liquid 之前都该先知道它存在。

路线 3 — App

存在、能用、不在范围:OP 的约束是「不要付费 app」,路线 1-2 已完整覆盖免费空间。

决策树

每个颜色只有一张图?      → 变体主图(+ Horizon「隐藏其他变体媒体」开关)。完事。
每个颜色有多张图?
  ├─ 是 Plus?            → Combined Listings。零代码。
  └─ 不是 Plus?          → Alt 文本标记 + Custom Liquid/JS 过滤。
                             alt 文本与选项名逐字符对齐。

检查清单

Agent 能接的那段活

选哪条路线是一次性决策。持续的活在它周围:新图上传时保持 alt 文本标记同步,发现没指定主图的变体,每次主题更新后重测图库,在顾客之前抓住「改了选项名之后突然不工作」这类回退。这是一个定期的店铺卫生循环——正是店铺运营 Agent 能接管的活:检查、对照规则、把异常连同证据一起交给人。我们做开箱即用的 Agent 来接这类循环,如果你的周末也耗在这种事上,可以看看。


上文已对照 Shopify 官方文档(Liquid variant.featured_image/featured_media、media.alt 与 product.media where 过滤写法、Admin GraphQL ProductVariant.media、Combined Listings 的可用性与行为)核验,核验时间 2026 年 8 月。社区帖内容(Horizon「隐藏其他变体媒体」设置、实测过的 alt 文本方案、OP 落地失败、并行 Horizon 帖)为 Shopify 社区主题 659928 的田野报告,出现处均已标注。