Search code examples
phpwordpresswoocommercecartdiscount

Quantity discount on 2nd item only in Woocommerce


I want to achieve a global discount for all products but only for the 2nd product item.

What do I mean? If the customer buys "Jacket" no discount is given.

Customer buys two of the "Jacket" product. 20% discount is given on the second "Jacket".

Customer buys five of the "Jacket" product. Still only 20% discount on the 2nd "Jacket".

It should work for all both simple and variable products.

I managed to figure this much out and I'm asking for help with how to make the discount apply to only the 2nd item.

Here's the code:

add_filter('woocommerce_product_get_price', 'fifty_percent_on_second_product', 90, 2 );
add_filter('woocommerce_product_get_regular_price', 'fifty_percent_on_second_product', 90, 2 );
function fifty_percent_on_second_product( $price, $product ) {
    if ( is_user_logged_in() ) { 

        I do not know what to do here

}   
    return $price;   
}

Does anyone know how to make this work? If so, please help me.


Solution

  • You could use the Fee API to get a discount (20%) on the 2nd item only this way:

    add_action( 'woocommerce_cart_calculate_fees', 'second_item_discount', 10, 1 );
    function second_item_discount( $cart ) {
    
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        $percentage = 20; // 20%
        $discount   = 0;
    
        // Loop through cart items
        foreach ( $cart->get_cart() as $cart_item ) {
            // When quantity is more than 1
            if( $cart_item['quantity'] > 1 ){
                // 20% of the product price as a discount
                $discount += wc_get_price_excluding_tax( $cart_item['data'] ) * $percentage / 100;
            }
        }
        if( $discount > 0 )
            $cart->add_fee( __( '2nd item discount', 'woocommerce' ) , -$discount );
    }
    

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