Adding a discount by cart items conditionally based on the item quantity
This code will not work in Woocommerce 3+…
Yes this is also possible, making a custom calculation for each cart item and replacing individually their price (matching your conditions and calculations), using a custom function hooked in woocommerce_before_calculate_totals
action hook.
This is the code:
add_action( 'woocommerce_before_calculate_totals', 'custom_discounted_cart_item_price', 10, 1 );function custom_discounted_cart_item_price( $cart_object ) { $discount_applied = false; // Set Here your targeted quantity discount $t_qty = 12; // Iterating through each item in cart foreach ( $cart_object->get_cart() as $item_values ) { ## Get cart item data $item_id = $item_values['data']->id; // Product ID $item_qty = $item_values['quantity']; // Item quantity $original_price = $item_values['data']->price; // Product original price // Getting the object $product = new WC_Product( $item_id ); // CALCULATION FOR EACH ITEM // when quantity is up to the targetted quantity and product is not on sale if( $item_qty >= $t_qty && !$product->is_on_sale() ){ for($j = $t_qty, $loops = 0; $j <= $item_qty; $j += $t_qty, $loops++); $modulo_qty = $item_qty % $t_qty; // The remaining non discounted items $item_discounted_price = $original_price * 0.9; // Discount of 10 percent $total_discounted_items_price = $loops * $t_qty * $item_discounted_price; $total_normal_items_price = $modulo_qty * $original_price; // Calculating the new item price $new_item_price = ($total_discounted_items_price + $total_normal_items_price) / $item_qty; // Setting the new price item $item_values['data']->price = $new_item_price; $discount_applied = true; } } // Optionally display a message for that discount if ( $discount_applied ) wc_add_notice( __( 'A quantity discount has been applied on some cart items.', 'my_theme_slug' ), 'success' );}
This make exactly the discount that you are expecting separately for each item in cart (based on it's quantity) and not for items that are in sale. But you will not get any label (text) indicating a discount in the line items of cart.
Optionally I display a notice when a discount is applied to some cart items…
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.