根据 Woocommerce 购物车小计阈值自动应用优惠券

Auto apply coupons based on Woocommerce cart subtotal thresholds

提问人:Phi Cao 提问时间:11/16/2023 最后编辑:LoicTheAztecPhi Cao 更新时间:11/16/2023 访问量:62

问:

尝试将优惠券自动应用于 WooCommerce 结帐。 尝试了许多片段,但似乎无法让它工作。

它要么抛出严重错误,要么不能可靠地应用优惠券。

我在WooCommerce中创建了以下优惠券:

  • black10:如果客户花费> 100 英镑和 < 英镑 199.99 英镑,购物车可享受 10% 的折扣
  • black20:如果客户花费 200 英镑>,购物车可享受 20% 的折扣

这是我的相关代码:

add_action( 'woocommerce_checkout_before_order_review' , 'add_coupon_notice' );
function add_coupon_notice() { 
    $cart_total = WC()->cart->get_subtotal();

    $currency_code = get_woocommerce_currency();
    wc_clear_notices();

    if ( $cart_total > 200 ) {
        WC()->cart->remove_coupon( 'black10' );
        WC()->cart->apply_coupon( 'black20' );
        wc_print_notice( '20% off £200 or more - Discount Applied!', 'notice' );
    } elseif ( $cart_total > 100 ) { 
        WC()->cart->remove_coupon( 'black20' );
        WC()->cart->apply_coupon( 'black10' );
        wc_print_notice( '10% off £100 or more - Discount Applied!', 'notice' );
    }
    

    wc_clear_notices();
}

但它不能可靠地工作。

PHP WordPress WooCommerce 优惠券 折扣

评论

0赞 LoicTheAztec 11/18/2023
您应该取消删除您的问题:stackoverflow.com/q/77503797/3730754 因为我有答案......

答:

1赞 LoicTheAztec 11/16/2023 #1

您可以使用以下替换代码,该代码将根据定义的购物车项目小计(包括税费阈值金额)可靠地应用/删除优惠券,并显示自定义通知:

add_action( 'woocommerce_before_calculate_totals' , 'discount_based_on_cart_items_subtotal' );
function discount_based_on_cart_items_subtotal( $cart ) { 
    if ( is_admin() && !defined('DOING_AJAX') )
        return;
    
    $subtotal = 0; // Initializing

    // Loop through cart items to get the subtotal excluding taxes
    foreach ( $cart->get_cart() as $item ) {
        $subtotal += $item['line_subtotal'] + $item['line_subtotal_tax'];
    }
    
    if ( $subtotal >= 100 && $subtotal < 200 ) { 
        if ( ! $cart->has_discount('black10') ) {
            $cart->apply_coupon( 'black10' );
            $notice = __('10% OFF for '.wc_price(100).' or more - Discount Applied!');
        }
        if ( $cart->has_discount('black20') ) {
            $cart->remove_coupon( 'black20' );
        }
    } elseif ( $subtotal >= 200 ) {
        if ( ! $cart->has_discount('black20') ) {
            $cart->apply_coupon( 'black20' );
            $notice = __('20% OFF for '.wc_price(200).' or more - Discount Applied!');
        }
        if ( $cart->has_discount('black10') ) {
            $cart->remove_coupon( 'black10' );
        }
    } else {
        if ( $cart->has_discount('black20') ) {
            $cart->remove_coupon( 'black20' );
        }
        if ( $cart->has_discount('black10') ) {
            $cart->remove_coupon( 'black10' );
        }
        wc_clear_notices();
    }
    
    if ( isset($notice) ) {
        wc_clear_notices();
        wc_add_notice( $notice, 'notice' );
    }
}

代码位于子主题的函数.php文件中(或插件中)。经过测试并有效。


对于不含税的小计,请替换:

$subtotal += $item['line_subtotal'] + $item['line_subtotal_tax'];

跟:

$subtotal += $item['line_subtotal'];

注意:

没有在优惠券设置中设置最低金额,因为代码正在处理它。

评论

0赞 Phi Cao 11/16/2023
已经尝试过这个,看起来是一个好的开始,我需要添加一些东西,例如如果购物车被调整并最终低于阈值,则删除优惠券(否则用户不断收到他们添加的优惠券无效的提示) if ( $subtotal < 100 ) { if ( $cart->has_discount('black10') ) { $cart->remove_coupon( 'black10' ); } if ( $cart->has_discount('black20') ) { $cart->remove_coupon( 'black20' ); 但继续得到一个错误。
0赞 Phi Cao 11/16/2023
我注意到该代码仅在您在创建优惠券时未定义最低支出时才有效。这在现实世界中是行不通的,因为有人可以手动输入“black20”作为优惠券代码,例如,购物车 20 英镑可享受 50% 的折扣。您可以尝试将最低支出分配给优惠券的代码吗?@LoicTheAztec
0赞 Phi Cao 11/16/2023
此外,Black10 优惠券在优惠券设置中的最低消费为 100 英镑(含税),因此如果 $subtotal(含税)>=100,则代码段应为
0赞 Phi Cao 11/16/2023
是的,你是对的,最新代码不需要在后端设置最低金额。一切都按预期进行。PS 我不得不删除其中一个wc_clear_notices();让它工作
0赞 Phi Cao 11/16/2023
我在isset($notice) ) { @LoicTheAztec