Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cart discount based on cart item count and only for items that are not in sale

In WooCommerce, I would like to give a discount of 10% specifically for those products that are not on sale. If cart item count is 5 or more items and not on sale, then I give a discount of 10%.

I use the following code to get a discount based on cart item count restriction here:

add_action('woocommerce_cart_calculate_fees' , 'add_custom_fees');

/**
* Add custom fee if more than three article
* @param WC_Cart $cart
*/

function add_custom_fees( WC_Cart $cart ){
     if( $cart->cart_contents_count < 5 ){
         return;
     } 
    // Calculate the amount to reduce
    $discount = $cart->subtotal * 0.1;
    $cart->add_fee( '10% discount', -$discount);
} 

But I don't know how to apply the discount only for items that are not in sale. How can I achieve it?

Thanks.

like image 762
Osman Avatar asked Jan 20 '17 16:01

Osman


1 Answers

Here is a custom hooked function that will apply to cart a discount, if there is 5 or more items in cart and no products on sale:

add_action('woocommerce_cart_calculate_fees' , 'custom_discount', 10, 1);
function custom_discount( $cart ){

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

    // Only when there is 5 or more items in cart
    if( $cart->get_cart_contents_count() >= 5):

        // Initialising variable
        $is_on_sale = false;

        // Iterating through each item in cart
        foreach( $cart->get_cart() as $cart_item ){
            // Getting an instance of the product object
            $product =  $cart_item['data'];

            // If a cart item is on sale, $is_on_sale is true and we stop the loop
            if($product->is_on_sale()){
                $is_on_sale = true;
                break;
            }
        }

        ## Discount calculation ##
        $discount = $cart->subtotal * -0.1;

        ## Applied discount (no products on sale) ##
        if(!$is_on_sale )
            $cart->add_fee( '10% discount', $discount);

    endif;
}

This code goes in function.php file of your active child theme (or theme) or also in any plugin file.

This code is tested and works perfectly.

like image 70
LoicTheAztec Avatar answered Sep 30 '22 06:09

LoicTheAztec