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 是否提供相应的服务端校验或结账扩展能力。
备注:内容仅供参考。
