Shopify Liquid中正确筛选区分应税商品的实现方案
问题根因
原有Liquid筛选写法失效,是因为基础where过滤器仅支持匹配对象的顶层单值属性。taxable是商品对象下variants数组内的变体子属性,不属于商品的顶层属性,无法被基础where直接识别匹配。
实现方案
使用Liquid内置的where_exp过滤器在集合层面完成筛选即可,不需要在遍历循环内写额外if判断做补丁,也不需要使用contain操作符。
筛选包含至少1个非应税变体的商品
{% assign non_taxable_products = collections.all.products | where_exp: "product", "product.variants.any? { |v| v.taxable == false }" %} {% for product in non_taxable_products %} <!-- 写入商品渲染逻辑 --> {% endfor %}
筛选所有变体均为非应税的商品
如果需求是提取全量变体都属于非应税类目的商品,替换判断条件为全量匹配规则即可:
{% assign fully_non_taxable_products = collections.all.products | where_exp: "product", "product.variants.all? { |v| v.taxable == false }" %} {% for product in fully_non_taxable_products %} <!-- 写入商品渲染逻辑 --> {% endfor %}
直接提取所有非应税变体对象
如果需要跳过商品维度,直接拿到所有非应税的变体列表,可以先打平变体数组再用基础where筛选:
{% assign all_variants = collections.all.products | map: 'variants' | flatten %} {% assign non_taxable_variants = all_variants | where: 'taxable', false %} {% for variant in non_taxable_variants %} <!-- 写入变体渲染逻辑 --> {% endfor %}
补充说明
- 上述筛选逻辑在集合赋值阶段完成,和后续渲染逻辑完全解耦,不属于遍历过程中加判断跳过的补丁式实现
any?、all?、flatten、map均为Liquid原生内置方法,全Shopify主题环境兼容,无需额外引入自定义逻辑
内容的提问来源于stack exchange,提问作者Gulshan S
相关产品推荐
相关产品推荐

