Search code examples
phpwordpressmagento

WooCommerce: Only allow products from the same category in cart


I'm wanting to stop customers from being able to add items from other categories once an item has been added to the cart. The customer should still be able to add items from the same category.

Here is what I have so far:

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);

This works if I already have an item in my cart but it doesn't let me add anything from an empty cart and always displays the error message.

Thanks!


Solution

  • After some tweaking I think I figured it out:

    #

    function is_product_the_same_cat($valid, $product_id, $quantity) {
        global $woocommerce;
        if($woocommerce->cart->cart_contents_count == 0){
             return true;
        }
        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' );
            foreach ($terms as $term) {
                $cat_ids[] = $term->term_id;  
            }
            foreach ($target_terms as $term) {
                $target_cat_ids[] = $term->term_id; 
            }           
        }
        $same_cat = array_intersect($cat_ids, $target_cat_ids);
        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);