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.
foreach ( $cart->cart_contents as $key => $values ) {
$product_id = $values['product_id'];
foreach ($cart->get_cart_item_quantities() as $key => $value){
//print_r($key[1]);
$key = array_keys($cart->get_cart_item_quantities())[1];
if($key == $product_id){
$product = wc_get_product($product_id);
$get_price = $product->get_price();
$new_price = $get_price / 2;
$values['data']->set_price($new_price);
break;
}
}
}
//Please try this, it will work for sure in same above hook :)
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.
add_action( 'woocommerce_before_calculate_totals', 'set_the_discount' );
function set_the_discount( $cart ) {
foreach ( $cart->cart_contents as $key => $value ) {
//please check whether your item is the second item of your cart or not?
//if this is your second item in your cart
//Set the 50% discount
$product_id = $value['product_id'];
$product = wc_get_product($product_id);
$get_price = $product->get_price();
$new_price = $get_price / 2;
$value['data']->set_price($new_price);
}
}
This hook can be used to set the price directly to the cart. Hope this may help