You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:36:03