如何在WooCommerce中用通配符匹配nm开头优惠券以绕过最低订单限制?
解决WooCommerce优惠券绕过最低订单金额(匹配以nm开头的优惠券)
我明白你的需求——你已经给WooCommerce设置了15美元的最低订单金额,现在想让所有以nm开头的优惠券都能绕过这个限制,但之前用通配符nm*的方法不管用,对吧?
问题出在WC()->cart->has_discount()这个函数上,它只支持精确匹配单个优惠券代码,根本不识别通配符。所以咱们得换个思路:直接遍历当前购物车里已应用的所有优惠券,检查有没有以nm开头的。
来看看修改后的完整代码,关键部分我都加了注释:
add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' ); // add_action( 'woocommerce_before_cart' , 'wc_minimum_order_amount' ); add_action( 'woocommerce_check_cart_items' , 'wc_minimum_order_amount' ); function wc_minimum_order_amount() { // 设置最低订单金额 $minimum = 15; // 检查是否有以nm开头的优惠券被应用 $has_valid_coupon = false; // 获取当前购物车中所有已应用的优惠券代码 $applied_coupons = WC()->cart->get_applied_coupons(); foreach ( $applied_coupons as $coupon_code ) { // 检查优惠券代码是否以'nm'开头 if ( substr( $coupon_code, 0, 2 ) === 'nm' ) { $has_valid_coupon = true; break; // 找到一个符合条件的就不用继续循环了 } } // 如果有符合条件的优惠券,跳过最低金额检查 if ( $has_valid_coupon ) { return; } // 剩下的最低金额检查逻辑保持不变 if ( WC()->cart->subtotal < $minimum ) { if( is_cart() ) { wc_print_notice( sprintf( 'You must have an order with a minimum of %s to place your order, your current order subtotal is %s.' , wc_price( $minimum ), wc_price( WC()->cart->subtotal ) ), 'error' ); } else { wc_add_notice( sprintf( 'You must have an order with a minimum of %s to place your order, your current order total is %s.' , wc_price( $minimum ), wc_price( WC()->cart->subtotal ) ), 'error' ); } } }
关键修改点说明:
- 用
WC()->cart->get_applied_coupons()获取所有已应用的优惠券列表,而非单个匹配 - 通过
substr( $coupon_code, 0, 2 ) === 'nm'精准判断优惠券代码的前两位是否为nm,不管后续字符是什么都能匹配 - 只要找到一个符合条件的优惠券,就标记
$has_valid_coupon为true,直接跳过最低金额检查
把这段代码替换你原来的函数,就能实现所有以nm开头的优惠券绕过最低订单金额的需求啦。
内容的提问来源于stack exchange,提问作者Cindy
相关产品推荐
相关产品推荐

