WooCommerce 校验购物车多个优惠券始终返回false的问题求助
故障根因
你调用in_array()时参数逻辑错误:该函数第一个参数传入数组时,会校验整个数组是否作为独立元素存在于第二个数组中。而WC()->cart->get_applied_coupons()返回的是字符串格式的优惠券编码数组,不存在值为['vip15', 'vip20']的元素,因此永远返回false。仅传入单个字符串优惠券编码时参数匹配逻辑正确,所以可以正常运行。
另外你当前把优惠券校验逻辑写在购物车商品循环内部,每遍历一个商品就会执行一次校验,会重复输出结果,建议把校验逻辑提到循环外。
修正方案
根据你实际需要的校验规则二选一即可:
场景1:校验任意一个指定优惠券已应用(只要有一个命中就算通过)
使用array_intersect()取两个数组的交集,判断交集非空即可:
add_action( 'woocommerce_after_checkout_billing_form', 'display_extra_fields_after_billing_address' , 10, 1 ); function display_extra_fields_after_billing_address () { // 校验预购商品标识 $preorder_in_cart = false; $coupon_codes = array('vip15', 'vip20'); $applied_coupons = WC()->cart->get_applied_coupons(); $match_coupons = array_intersect($coupon_codes, $applied_coupons); // 优惠券校验提前到循环外,只执行一次 if(!empty($match_coupons)){ echo 'found'; } else { echo 'not found'; } // 遍历购物车商品 foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $product_id = $cart_item['product_id']; $product = wc_get_product( $product_id ); if( 'yes' === $product->get_meta( '_ywpo_preorder' ) ) { $preorder_in_cart = true; // 匹配到预购商品可以提前跳出循环,提升性能 break; } } }
场景2:校验所有指定优惠券全部已应用(两个优惠券都用了才算通过)
判断交集的长度和你指定的优惠券数组长度相等即可,把上面的优惠券校验逻辑替换为以下代码:
if(count($match_coupons) === count($coupon_codes)){ echo 'found'; } else { echo 'not found'; }
内容的提问来源于stack exchange,提问作者Junky
相关产品推荐
相关产品推荐

