Woocommerce按条件为购物车符合规则商品设置10%折扣实现问题
Woocommerce指定组合商品折扣实现方案
原有代码核心逻辑缺陷如下:
- 未指定另外两个可参与折扣的商品ID,无法区分无关商品
- 没有统计必填商品、可折扣商品的数量,无法实现多套套餐的匹配逻辑
- 没有按规则优先对低价可折扣商品应用优惠
- 调用
add_fee时传递正数会增加用户应付金额,折扣需要传递负值
以下是完整可运行的修正代码:
function apply_discount_ten( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // 请替换为你实际的商品ID:必填商品ID,可折扣商品1、2的ID $required_product_id = 2530; $eligible_discount_product_ids = [123, 456]; // 对应售价15欧、12欧的两个商品ID $required_count = 0; // 必填商品总数量 $eligible_products = []; // 符合条件的可折扣商品列表 $required_product_price = 0; // 遍历购物车筛选指定商品 foreach ( $cart->get_cart() as $cart_item ) { $product = $cart_item['data']; $product_id = $product->get_id(); $qty = $cart_item['quantity']; $price = $product->get_price(); // 统计必填商品 if ($product_id == $required_product_id) { $required_count += $qty; $required_product_price = $price; continue; } // 收集可折扣商品 if (in_array($product_id, $eligible_discount_product_ids)) { for ($i=0; $i<$qty; $i++) { $eligible_products[] = $price; } } } // 计算可享受的套餐数量:取必填商品数和可折扣商品数的最小值 $package_count = min($required_count, count($eligible_products)); if ($package_count <= 0) { return; } // 可折扣商品按价格从低到高排序,优先给低价商品打折 asort($eligible_products); // 取对应套餐数量的低价商品 $discounted_eligible = array_slice($eligible_products, 0, $package_count); // 计算总折扣:每个套餐包含1个必填商品10%折扣 + 1个可折扣商品10%折扣 $total_discount = 0; $total_discount += $required_product_price * 0.1 * $package_count; foreach ($discounted_eligible as $price) { $total_discount += $price * 0.1; } // 添加折扣(负值代表扣减金额) if ($total_discount > 0) { $cart->add_fee( '10%套餐折扣', -$total_discount, true ); } } add_action( 'woocommerce_cart_calculate_fees', 'apply_discount_ten', 10, 1 );
注意事项
- 使用前请将
$eligible_discount_product_ids数组内的ID替换为你店铺内对应两个可参与折扣商品的实际ID - 代码已适配所有需求场景:自动排除无关商品、优先给低价可折扣商品打折、按商品数量匹配可享受的套餐套数
- 折扣会自动显示在购物车和结算页的费用明细中,符合Woocommerce原生交互逻辑
内容的提问来源于stack exchange,提问作者Lubo Masura
相关产品推荐
相关产品推荐

