PAYATHON 2026

Big Cartel Shop:checkout 前要求 cart 包含指定 category 商品

支付小周

正确做法

遍历 cart.items,逐一检查每件商品的 product.categories。找到名称为 time 的分类后,将标记设为 true,再根据标记决定是否显示 Checkout 按钮。

{% assign has_time_product = false %}

{% for item in cart.items %}
  {% for category in item.product.categories %}
    {% if category.name == 'time' %}
      {% assign has_time_product = true %}
    {% endif %}
  {% endfor %}
{% endfor %}

{% if has_time_product %}
  Checkout
{% else %}
  Please add a product from Time to continue
{% endif %}

原判断为什么无效

cart.items 是购物车项目的集合,不能通过 cart.items_category.name 直接访问分类。分类属于每个购物车项目对应的商品,因此要从单个项目开始访问:

item.product.categories

time 是字符串,比较时需要加引号:

{% if category.name == 'time' %}

如果不加引号,Liquid 会把 time 当作变量,而不是分类名称。

放入实际 Checkout 区域

用判断逻辑包住原有的 Checkout 按钮即可。例如:

{% assign has_time_product = false %}

{% for item in cart.items %}
  {% for category in item.product.categories %}
    {% if category.name == 'time' %}
      {% assign has_time_product = true %}
    {% endif %}
  {% endfor %}
{% endfor %}

{% if has_time_product %}
  <button type="submit" name="checkout">Checkout</button>
{% else %}
  <p>Please add a delivery time before continuing to checkout.</p>
{% endif %}

具体的按钮 HTML 应沿用当前 Big Cartel 主题中的原有写法,只修改按钮外围的判断逻辑。

注意事项

分类名称比较通常区分大小写。代码中的 'time' 必须与后台实际的分类名称一致。如果分类显示名称是 Time,判断也要相应改为:

{% if category.name == 'Time' %}

如果主题环境提供稳定的分类标识,例如 permalink,可以优先比较该标识,避免管理员修改分类显示名称后导致判断失效:

{% if category.permalink == 'time' %}

该属性是否可用,应以当前 Big Cartel 主题变量文档为准。

这段代码只能控制主题页面是否显示 Checkout 按钮,属于前端界面限制,不等同于服务端订单校验。如果客户能通过其他 URL 或流程直接进入结账页,仅隐藏按钮可能无法完全阻止结账。若这项业务规则必须强制执行,还需确认 Big Cartel 是否提供相应的服务端校验或结账扩展能力。

备注:内容仅供参考。