Auto apply a percentage or fixed cart discount based on the total in WooCommerce

╄→尐↘猪︶ㄣ 提交于 2019-12-01 10:45:32

You can use a custom function hooked in woocommerce_before_calculate_totals action hook where you will define 2 coupons codes:

  • A percentage discount coupon code (of 10%)
  • A fixed amount discount coupon code (of $20)

The code:

add_action( 'woocommerce_before_calculate_totals', 'auto_add_coupons_total_based', 10, 1 );
function auto_add_coupons_total_based( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // HERE define your coupon code
    $coupon_percent = 'uget10percent'; # <===  <===  <===  <===  <===  <===
    $coupon_fixed = 'uget20off'; # <===  <===  <===  <===  <===  <===  <===

    // Get cart subtotal
    $subtotal = 0;
    foreach($cart->get_cart() as $cart_item ){
        $subtotal += $cart_item['line_subtotal'];
        $subtotal += $cart_item['line_subtotal_tax']; // with taxes
    }

    // Coupon type "percent" (less than 200)
    if( $subtotal < 200 && ! $cart->has_discount( $coupon_percent ) ){
        // If coupon "fixed amount" type is in cart we remove it
        if( $cart->has_discount( $coupon_fixed ) )
            $cart->remove_coupon( $coupon_fixed );

        // Apply the "percent" type coupon code
        $cart->add_discount( $coupon_percent );
    }
    // Coupon type "fixed amount" (Up to 200)
    elseif( $subtotal >= 200 && ! $cart->has_discount( $coupon_fixed ) ) {
        // If coupon "percent" type is in cart we remove it
        if( $cart->has_discount( $coupon_percent ) )
            $cart->remove_coupon( $coupon_percent );

        // Apply the "fixed amount" type coupon code
        $cart->add_discount( $coupon_fixed );
    }
}

Code goes in function.php file of the active child theme (or active theme).

Tested and works.

If you want to apply it on subtotal without taxes you will have to comment this line:

$subtotal += $cart_item['line_subtotal_tax']; // with taxes

OR you can also use a negative fee (so a discount) instead of coupons this way:

add_action( 'woocommerce_cart_calculate_fees', 'discount_based_on_total', 25, 1 );
function discount_based_on_total( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    $total = $cart->cart_contents_total;

    // Percentage discount (10%)
    if( $total < 200 )
        $discount = $total * 0.1;
    // Fixed amount discount ($20)
    else
        $discount = 20;

    // Add the discount
    $cart->add_fee( __('discount', 'woocommerce'), -$discount );
}

Code goes in function.php file of the active child theme (or active theme).

Tested and works.

Ok so I finally figure out how to use this code so that it only triggers when the coupon is added. I also added a script to notify the buyer that the coupon discount limit has been reached

add_action( 'woocommerce_before_calculate_totals', 'auto_add_coupons_total_based', 10, 1 ); function auto_add_coupons_total_based( $cart ) {

if ( is_admin() && ! defined( 'DOING_AJAX' ) )
    return;

// HERE define your coupon code
$coupon_percent = 'xyz20'; # <===  <===  <===  <===  <===  <===
$coupon_fixed = 'fixedamount'; # <===  <===  <===  <===  <===  <===  <===

// Get cart subtotal
$subtotal = 0;
foreach($cart->get_cart() as $cart_item ){
    $subtotal += $cart_item['line_subtotal'];
    $subtotal += $cart_item['line_subtotal_tax']; // with taxes
}

//Set HERE the limit amount
$limit = 40; //without Tax


// Coupon type "percent" (less than 200)
if( $subtotal < 200 && ! $cart->has_discount( $coupon_percent ) ){
    // If coupon "fixed amount" type is in cart we remove it
    if( $cart->has_discount( $coupon_fixed ) )
        $cart->remove_coupon( $coupon_fixed );


}
// Coupon type "fixed amount" (Up to 200)
if( $subtotal >= 200 && $cart->has_discount( $coupon_percent ) ) {
    // If coupon "percent" type is in cart we remove it
    if( $cart->has_discount( $coupon_percent ) )
        $cart->remove_coupon( $coupon_percent );

    // Apply the "fixed amount" type coupon code
    $cart->add_discount( $coupon_fixed );


    // Displaying a custom message
        $message = __( "The total discount limit of $$limit has been reached", "woocommerce" );
        wc_add_notice( $message, 'notice' );



}

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!