October 2018 - Improved updated code version:
Disable other product categories for a cart item from specific category in Woocommerce
Try the following code, that will:
- Avoid add to cart when a product from a specific product category is in cart
- Remove other cart items when a product from a specific product category is added to cart
The code:
// Remove other items when our specific product is added to cart
add_action( 'woocommerce_add_to_cart', 'remove_other_products_on_add_to_cart', 10, 6 );
function remove_other_products_on_add_to_cart ( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data ){
// HERE set your product category (can be term IDs, slugs or names)
$category = 'posters';
// We remove other items when our specific product is added to cart
if( has_term( $category, 'product_cat', $product_id ) ) {
foreach( WC()->cart->get_cart() as $item_key => $cart_item ){
if( ! has_term( $category, 'product_cat', $cart_item['product_id'] ) ) {
WC()->cart->remove_cart_item( $item_key );
}
}
}
}
// Avoid other items to be added to cart when our specific product is in cart
add_filter( 'woocommerce_add_to_cart_validation', 'check_and_limit_cart_items', 10, 3 );
function check_and_limit_cart_items ( $passed, $product_id, $quantity ){
// HERE set your product category (can be term IDs, slugs or names)
$category = 'posters';
// We exit if the cart is empty
if( WC()->cart->is_empty() )
return $passed;
// CHECK CART ITEMS: search for items from product category
foreach ( WC()->cart->get_cart() as $cart_item ){
if( has_term( $category, 'product_cat', $cart_item['product_id'] ) ) {
// Display an warning message
wc_add_notice( __('A subscription is already in cart (Other items are not allowed in cart).', 'woocommerce' ), 'error' );
// Avoid add to cart
return false;
}
}
return $passed;
}
Code goes in function.php file of your active child theme (or active theme). Tested and works.