WooCommerce属性折扣适配:让简单产品支持满6件15%优惠
WooCommerce 带指定属性商品满件折扣修复(支持简单+变体产品)
原代码仅对带flaske属性的可变产品(变体)生效,无法覆盖同属性的简单产品。问题出在仅遍历购物车项的variation数组——简单产品没有该数组,因此被排除在外。以下是修复后的代码,同时支持两类产品:
// 针对带指定属性的商品,满6件及以上应用15%折扣 add_action( 'woocommerce_cart_calculate_fees','wc_cart_item_quantity_discount' ); function wc_cart_item_quantity_discount( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // 初始化变量 $min_total_quantity = 6; // 触发折扣的最低累计数量 $discount = $items_count = $percent = $items_subtotal = 0; $taxonomy = 'pa_variant'; // 属性分类 $target_term = 'flaske'; // 目标属性值 // 遍历购物车所有商品 foreach( $cart->get_cart() as $cart_item ) { $product = $cart_item['data']; $has_target_attribute = false; // 处理变体产品:检查变体属性 if ( $product->is_type('variation') ) { foreach( $cart_item['variation'] as $attribute => $term_slug ) { if( $attribute === 'attribute_'.$taxonomy && $term_slug === $target_term ) { $has_target_attribute = true; break; } } } // 处理简单产品:直接获取产品属性 elseif ( $product->is_type('simple') ) { $attribute_value = $product->get_attribute($taxonomy); if ( $attribute_value === $target_term ) { $has_target_attribute = true; } } // 如果商品符合属性要求,累计数量和小计 if ( $has_target_attribute ) { $items_count += $cart_item['quantity']; $items_subtotal += $cart_item['line_subtotal']; } } // 累计数量达标时设置折扣比例 if ( $items_count >= $min_total_quantity ) { $percent = 15; } // 添加折扣费用(含税) if( $percent > 0 ) { $discount_amount = -($items_subtotal / 100) * $percent; $cart->add_fee( __( "Mix & Match 折扣 - $percent%", "woocommerce" ), $discount_amount, true); } }
修改关键点说明:
- 修正逻辑错误:移除了原代码中错误的「商品单价≥6」判断,改为按需求累计符合属性要求的商品总数量
- 新增简单产品支持:通过
get_attribute()方法直接获取简单产品的指定属性值,判断是否符合要求 - 分类处理产品类型:分别针对变体、简单产品做属性检查,确保两类产品都能被识别
- 优化折扣触发条件:只有当累计数量达标时才计算折扣,避免无效的费用添加
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

