如果小计低于最低金额,Woocommerce 不应用优惠券

Woocommerce do not apply coupon if subtotal below minimum amount

我有问题。 我有优惠券可以给我 15% 的折扣。 我还有最低 200 美元的送货方式。 我注意到如果我使用优惠券金额 ~ 200 美元,小计低于 200 美元并且优惠券送货方式有效。 我想创建一种方法来限制在小计低于 200 美元时不应用更智能的优惠券。

我正在尝试的代码是:

add_action( 'woocommerce_before_cart' , 'home_test_coupon_fix' );
add_action( 'woocommerce_before_checkout_form' , 'home_test_coupon_fix' );
function home_test_coupon_fix() {
    $cart_total = WC()->cart->get_subtotal();
    $coupon_id = 'hometest';
    $minimum_amount = 200 + WC()->cart->get_coupon_discount_amount( 'hometest' );
    $currency_code = get_woocommerce_currency();
    wc_clear_notices();
    
    echo $minimum_amount;

    if ( $cart_total < $minimum_amount && $woocommerce->cart->applied_coupons === $coupon_id ) {
         WC()->cart->remove_coupon( 'hometest' );
         wc_print_notice( "Get 50% off if you spend more than $minimum_amount $currency_code!", 'notice' );
    } 
    wc_clear_notices();
}

您的代码中存在一些错误。首先,您没有将 global $woocommerce; 声明为函数的开始。 $woocommerce->cart->applied_coupons 这将是数组,因此您必须传递密钥才能检查 hometest

add_action( 'woocommerce_before_cart' , 'home_test_coupon_fix' );
add_action( 'woocommerce_before_checkout_form' , 'home_test_coupon_fix' );

function home_test_coupon_fix() {
    global $woocommerce;
    $cart_total     = WC()->cart->get_subtotal();
    $coupon_id      = 'hometest';
    $minimum_amount = 500 + WC()->cart->get_coupon_discount_amount( $coupon_id );
    $currency_code  = get_woocommerce_currency();
    wc_clear_notices();
    if ( $cart_total < $minimum_amount && $woocommerce->cart->applied_coupons[0] === $coupon_id ) {
        WC()->cart->remove_coupon( 'hometest' );
        wc_print_notice( "Get 50% off if you spend more than $minimum_amount $currency_code!", 'notice' );
    } 
    wc_clear_notices();
}

根据 OP 要求更新

您可以使用 woocommerce_coupon_message 过滤器挂钩删除优惠券消息。

function remove_coupon_message( $msg, $msg_code, $this ){
    global $woocommerce;
    $cart_total     = WC()->cart->get_subtotal();
    $coupon_id      = 'hometest';
    $minimum_amount = 500 + WC()->cart->get_coupon_discount_amount( $coupon_id );
    $currency_code  = get_woocommerce_currency();
    wc_clear_notices();
    if ( $cart_total <= $minimum_amount && $woocommerce->cart->applied_coupons[0] === $coupon_id ) {
        return "";  
    }
    return $msg;
}
add_filter('woocommerce_coupon_message','remove_coupon_message', 10,3 );

已测试并有效。