基于指定产品ID数量调整WooCommerce购物车特定商品价格的问题
解决WooCommerce多份商品优惠不生效问题
原代码的核心问题在于两点:
- 使用了
break语句,修改第一个符合条件的商品后就终止循环,导致后续的1561商品(若为多个购物车条目)无法享受优惠 - 仅当累计指定商品数量≥2时才触发价格修改,逻辑不符合你“所有1561商品均按10NIS计价”的需求
下面是修改后的代码,实现只要购物车中包含指定组内的任意商品,所有ID为1561的商品都按10NIS计价:
add_action('woocommerce_before_calculate_totals', 'apply_universal_discount_to_target_product', 10, 1); function apply_universal_discount_to_target_product($cart) { if (is_admin() && !defined('DOING_AJAX')) { return; } // 配置参数 $discounted_product_id = 1561; $new_price = 10; // NIS 10 $trigger_product_ids = array(1561, 1919, 1568, 1562, 1563, 1564, 1565, 1566, 1567); // 检查是否满足优惠触发条件 $discount_triggered = false; foreach ($cart->get_cart() as $cart_item) { if (in_array($cart_item['product_id'], $trigger_product_ids)) { $discount_triggered = true; break; } } // 给所有目标商品设置优惠价 if ($discount_triggered) { foreach ($cart->get_cart() as $cart_item_key => $cart_item) { if ($cart_item['product_id'] == $discounted_product_id) { $cart_item['data']->set_regular_price($new_price); $cart_item['data']->set_price($new_price); $cart_item['data']->set_sale_price($new_price); // 确保价格显示一致 } } } }
代码说明:
- 触发条件检查:先遍历购物车确认是否存在指定组内的商品,只要有一个就激活优惠
- 批量修改价格:激活优惠后,遍历所有购物车条目,将所有1561商品的单价统一设置为10NIS
- 兼容性处理:同时设置
regular_price、price和sale_price,避免不同场景下价格显示异常 - 取消终止循环:移除原代码的
break,确保所有符合条件的商品都能被处理
内容的提问来源于stack exchange,提问作者yael yaari
相关产品推荐
相关产品推荐

