Reputation: 672
I am trying to add a custom cart discount based on a minimal cart item count and categories.
I have take the code from this answer:
Cart discount based on cart item count and only for items that are not in sale
I have made some changes to it and this is my code:
add_action('woocommerce_cart_calculate_fees' , 'my_custom_discount', 10, 1);
function my_custom_discount( $cart_object ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Only when there is 4 or more items in cart
if( $cart_object->get_cart_contents_count() >= 4):
// Defining variables
$categories = array('mycategory1','mycategory2');
$has_category = false;
// Iterating through each item in cart
foreach( $cart_object->get_cart() as $cart_item ){
// Getting an instance of the product object
$_product = new WC_Product( $cart_item['product_id'] );
// If a cart item has the category
if(has_category($category, $_product)){
$has_category = true;
break;
}
}
## Discount calculation ##
$discount = $cart_object->subtotal * -0.03;
## Applied discount (no products on sale) ##
if($has_category )
$cart_object->add_fee( '3% discount', $discount);
endif;
}
I can’t make it work.
What I am doing wrong and How to make it work?
Thanks
Upvotes: 1
Views: 179
Reputation: 253901
As product categories are a custom taxonomy 'product_cat'
you will need to use has_term()
conditional function (instead of has_category()
) this way:
add_action('woocommerce_cart_calculate_fees' , 'my_custom_discount', 10, 1);
function my_custom_discount( $cart_obj ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Only when there is 4 or more items in cart
if ( $cart_obj->get_cart_contents_count() > 3):
// Set HERE your array of categories (slugs, IDs or names) <== <== <== <== <==
$categories = array('mycategory1','mycategory2');
// Initialising variable
$has_category = false;
// Iterating through each item in cart
foreach( $cart_obj->get_cart() as $cart_item ){
// The product ID
$product_id = $cart_item['product_id'];
// When a cart item is from one defined product categories we set $has_category to true.
if ( has_term( $categories, 'product_cat', $product_id ) ) {
$has_category = true;
break;
}
}
## Discount calculation ##
$discount = $cart_obj->subtotal * -0.03;
## Applied discount (for products (items) of defined product categories) ##
if( $has_category )
$cart_obj->add_fee( '3% 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 for WooCommerce version 2.6+ and 3.0+
Upvotes: 1