Search code examples
phpwordpresswoocommercecartcustom-taxonomy

Disable shopping when an item from a specific product category is in cart in Woocommerce


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:

But didn't helped.

How can I disable shopping if a specific product category is in cart on Woocommerce?

output problem image


Solution

  • 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:

    1. Avoid add to cart when a product from a specific product category is in cart
    2. 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.