Search code examples
phpwordpresswoocommercecategoriesdiscount

Discount for Certain Category Based on Total Number of Products


In WooCommerce, I have a category of products called Samples, each sample costs $2.99. But I'd like a way to automatically change the cost of the Samples from $2.99 to $1 when 5 Samples are added to cart.

So if 4 samples are added to cart, the total would be $11.96… but if 5 were added the total would be $5.

So for every 5 products, the product price would change from $2.99 to $1 but if 6 Samples were added to cart the total would be $7.99 and if 10 were added the total would be $10 etc...

How could I achieve this?

Thanks.


Solution

  • UpdateAdded Woocommerce 3 compatibility.

    Here is something that should be convenient to your requirements.
    This function will add discount to cart:

    add_action( 'woocommerce_cart_calculate_fees','custom_cart_discount', 20, 1 );
    function custom_cart_discount( $cart ) {
    
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        // Define HERE your targeted product category (id, slug or name are accepted)
        $category = 'posters';
        // Set the price for Five HERE
        $price_x5 = 5;
    
        // initializing variables
        $calculated_qty = 0;
        $calculated_total = 0;
        $discount = 0;
    
        // Iterating through each cart item
        foreach($cart->get_cart() as $cart_item):
    
            // Make this discount calculations only for products of your targeted category
            if(has_term($category, 'product_cat', $cart_item['product_id'])):
                $item_price = version_compare( WC_VERSION, '3.0', '<' ) ? $cart_item['data']->price : $cart_item['data']->get_price(); // The price for one (assuming that there is always 2.99)
                $item_qty = $cart_item["quantity"];// Quantity
                $item_line_total = $cart_item["line_total"]; // Item total price (price x quantity)
                $calculated_qty += $item_qty; // ctotal number of items in cart
                $calculated_total += $item_line_total; // calculated total items amount
            endif;
        endforeach;
    
        // ## CALCULATIONS (updated) ##
        if($calculated_qty >= 5):      
            for($j = 5, $k=0; $j <= $calculated_qty; $j+=5,$k++); // Update $k=0 (instead of $k=1)
            $qty_modulo = $calculated_qty % 5;
            $calculation = ( $k * $price_x5 ) + ($qty_modulo * $item_price);
            $discount -= $calculated_total - $calculation;
        endif;
    
        // Adding the discount 
        if ($discount != 0)
            $cart->add_fee( __( 'Quantity discount', 'woocommerce' ), $discount, false );
            // Note: Last argument in add_fee() method is related to applying the tax or not to the discount (true or false)
    }
    

    Code goes in function.php file of your active child theme (or active theme). Tested and works.