Shopify Scripts:已拒绝折扣无法获取,如何实现指定商品单独折扣?
解决Shopify订单级折扣转特定商品折扣的脚本问题
核心结论:无法直接获取已被拒绝的折扣百分比——Shopify在拒绝折扣后会完全移除该折扣的所有记录,脚本二次运行时确实无法读取到原折扣信息。以下是几个可行的替代方案:
方案1:提前用购物车属性存储折扣信息
在拒绝订单级折扣之前,先将折扣比例存入购物车的临时属性中,确保二次运行脚本时能读取到历史折扣数据:
# 定位订单级百分比折扣 order_discount = Input.cart.discounts.detect { |d| d.type == :percentage && d.applies_to_entire_cart } if order_discount # 拒绝折扣前先存储折扣比例到购物车属性 Input.cart.attributes['order_discount_percent'] = order_discount.percentage.to_s # 给特定商品(例:商品A)应用折扣 Input.cart.line_items.each do |line_item| if line_item.product.title == '商品A' # 替换为你的商品判断逻辑(如SKU、标签) discounted_price = line_item.variant.price * (1 - order_discount.percentage / 100.0) line_item.change_price(discounted_price) end end # 拒绝订单级折扣 Input.cart.discounts.reject! { |d| d == order_discount } end
注意:若之前存属性被丢弃,大概率是存储时机错误(拒绝折扣后才存)或属性名含特殊字符,确保属性名合法且在拒绝前执行存储逻辑。
方案2:用订单项属性标记处理状态
给已应用折扣的订单项添加标记,脚本二次运行时通过标记判断是否已完成折扣转移,无需依赖原订单折扣:
# 检查是否已经处理过折扣转移 already_processed = Input.cart.line_items.any? { |li| li.properties['discount_transferred'] == 'true' } return if already_processed order_discount = Input.cart.discounts.detect { |d| d.type == :percentage && d.applies_to_entire_cart } if order_discount Input.cart.line_items.each do |line_item| if line_item.product.title == '商品A' discounted_price = line_item.variant.price * (1 - order_discount.percentage / 100.0) line_item.change_price(discounted_price) # 给当前订单项添加已处理标记 line_item.properties['discount_transferred'] = 'true' end end Input.cart.discounts.reject! { |d| d == order_discount } end
这种方式从根源上避免了依赖已移除的折扣数据,通过订单项的本地属性判断执行逻辑,稳定性更高。
方案3:直接查询折扣码规则(需API权限)
如果是折扣码触发的订单折扣,可通过折扣码代码查询对应的折扣规则,直接获取百分比:
discount_code = Input.cart.discount_code if discount_code # 查询折扣码对应的折扣规则 discount = ShopifyAPI::DiscountCode.find(discount_code.code).discount if discount.type == 'percentage' && discount.applies_to_entire_cart? discount_percent = discount.value # 执行特定商品改价逻辑 end end
此方案需要脚本配置Shopify API访问权限,适合具备开发能力的场景。
内容的提问来源于stack exchange,提问作者Fabio Filippi
相关产品推荐
相关产品推荐

