Shopify Liquid购物车按商品所属集合计数显示优惠提示问题
Shopify购物车分集合统计满件优惠提示实现方案
问题核心原因
原有逻辑的错误来自两点:
- 用全局购物车总商品数
cart.item_count作为所有优惠的判断依据,没有单独统计每个优惠集合下的实际有效商品数 - 判断逻辑嵌套在购物车商品遍历循环内,会导致同一条提示重复渲染,也没有统计单个商品行的加购数量
item.quantity,同个商品加购多件时计数不准
正确实现逻辑
- 提前为每个优惠集合初始化独立的计数变量,初始值为0
- 遍历所有购物车商品,匹配商品所属的优惠集合,将当前商品行的加购数量累加到对应集合的计数变量上
- 商品遍历完成后,逐个校验每个优惠规则:当对应集合的累计商品数大于0、且未达到优惠阈值时,输出对应凑单提示
可直接复用的Liquid代码
{% comment %} 初始化各优惠集合的商品计数 {% endcomment %} {% assign count_5for20 = 0 %} {% assign count_4for10 = 0 %} {% assign count_3for10 = 0 %} {% assign count_3for35 = 0 %} {% assign count_3for20 = 0 %} {% comment %} 遍历购物车,按集合累加有效商品数量(含同商品多件加购的数量) {% endcomment %} {% for item in cart.items %} {% assign product_collections = item.product.collections | map: 'title' %} {% if product_collections contains '5 for 20' %} {% assign count_5for20 = count_5for20 | plus: item.quantity %} {% endif %} {% if product_collections contains '4 for 10' %} {% assign count_4for10 = count_4for10 | plus: item.quantity %} {% endif %} {% if product_collections contains '3 for 10' %} {% assign count_3for10 = count_3for10 | plus: item.quantity %} {% endif %} {% if product_collections contains '3 for 35' %} {% assign count_3for35 = count_3for35 | plus: item.quantity %} {% endif %} {% if product_collections contains '3 for 20' %} {% assign count_3for20 = count_3for20 | plus: item.quantity %} {% endif %} {% endfor %} {% comment %} 统一输出符合条件的凑单提示 {% endcomment %} <div class="cart-promotion-tips"> {% if count_5for20 > 0 and count_5for20 < 5 %} <span>You can get 5 for 20 deal, add {{ 5 | minus: count_5for20 }} more eligible items</span> {% endif %} {% if count_4for10 > 0 and count_4for10 < 4 %} <span>You can get 4 for 10 deal, add {{ 4 | minus: count_4for10 }} more eligible items</span> {% endif %} {% if count_3for10 > 0 and count_3for10 < 3 %} <span>You can get 3 for 10 deal, add {{ 3 | minus: count_3for10 }} more eligible items</span> {% endif %} {% if count_3for35 > 0 and count_3for35 < 3 %} <span>You can get 3 for 35 deal, add {{ 3 | minus: count_3for35 }} more eligible items</span> {% endif %} {% if count_3for20 > 0 and count_3for20 < 3 %} <span>You can get 3 for 20 deal, add {{ 3 | minus: count_3for20 }} more eligible items</span> {% endif %} </div>
补充说明
- 代码中默认加入了「还差X件即可享受优惠」的提示文案,如果不需要可以直接删除差值计算部分,换回原有的
you can get X for Y文案即可 - 如果商品可能同时归属多个优惠集合,当前逻辑会同时展示所有满足条件的优惠提示,符合多活动并行的业务场景
- 后续新增满件优惠规则时,只需要新增对应计数变量、累加判断、输出判断三段逻辑即可,维护成本低
内容的提问来源于stack exchange,提问作者senwmn
相关产品推荐
相关产品推荐

