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







All Articles