Limit purchases to 1 product category at a time in WooCommerce 3.0+
I have updated WooCommerce to version 3.0+ and this custom feature no longer works as it used to. Even if my shopping cart is empty, I get an error as if something from a different category is already in my shopping cart.
Here is the code I'm using:
function is_product_the_same_cat($valid, $product_id, $quantity) {
global $woocommerce;
// start of the loop that fetches the cart items
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
$terms = get_the_terms( $_product->id, 'product_cat' );
$target_terms = get_the_terms( $product_id, 'product_cat' ); //get the current items
foreach ($terms as $term) {
$cat_ids[] = $term->term_id; //get all the item categories in the cart
}
foreach ($target_terms as $term) {
$target_cat_ids[] = $term->term_id; //get all the categories of the product
}
}
$same_cat = array_intersect($cat_ids, $target_cat_ids); //check if they have the same category
if(count($same_cat) > 0) return $valid;
else {
wc_add_notice( 'This product is in another category!', 'error' );
return false;
}
}
add_filter( 'woocommerce_add_to_cart_validation', 'is_product_the_same_cat',10,3);
How to make it work for WooCommerce version 3.0+, any idea?
thank
+3
source to share
1 answer
You should try this other code, which will do the same:
add_filter( 'woocommerce_add_to_cart_validation', 'checking_conditionaly_product_categories', 10, 3 );
function checking_conditionaly_product_categories( $passed, $product_id, $quantity) {
// Getting the product categories slugs in an array for the current product
$product_cats_object = get_the_terms( $product_id, 'product_cat' );
foreach($product_cats_object as $obj_prod_cat)
$product_cats[] = $obj_prod_cat->slug;
// Iterating through each cart item
foreach (WC()->cart->get_cart() as $cart_item_values ){
// When the product category of the current product match with a cart item
if( has_term( $product_cats, 'product_cat', $cart_item_values['product_id'] ))
{
// Displaying a message
wc_add_notice( 'Only one product from each category is allowed in cart', 'error' );
$passed = false; // Set to false
break; // stop the loop
}
}
return $passed;
}
This code is found in the function.php file of your active child theme (or theme), as well as any plugin file.
This code has been tested and works for WooCommerce version 2.6+ and 3.0+
Similar Answer: Allow only one product for each product category in the cart
0
source to share