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

后端 未结 2 1774
梦毁少年i
梦毁少年i 2021-01-15 11:13

I\'m trying to set up a coupon on my client\'s WooCommerce site so that a percentage discount applies if the total cart is below a cap amount or a fixed amount is equal or g

2条回答
  •  自闭症患者
    2021-01-15 12:17

    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.

提交回复
热议问题