I am trying to Disable shopping if a an item from a specific product category is in cart (which is a subscription in form of product with tabs – checkout and shipping are stripped off). When that product is added to cart, no other products should be allowed to be add up.
I have tried those threads code:
- Disable Woocommerce add to cart button if the product is already in cart
 - Prevent checkout for cart with specific category
 
But didn’t helped.
How can I disable shopping if a specific product category is in cart on Woocommerce?
Advertisement
Answer
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.
