Разрешить только одну категорию товаров в корзине одновременно в Woocommerce

Как мне настроить корзину Woocommerce, чтобы разрешить в ней только один тип категории продуктов за раз?


person Isaac Byrne    schedule 26.09.2018    source источник


Ответы (1)


Следующий код позволит добавлять в корзину только товары из одной категории продуктов, избегая добавления в корзину и отображая пользовательское уведомление:

add_filter( 'woocommerce_add_to_cart_validation', 'only_one_product_category_allowed', 20, 3 );
function only_one_product_category_allowed( $passed, $product_id, $quantity) {

    // Getting the product categories term slugs in an array for the current product
    $term_slugs   = wp_get_post_terms( $product_id, 'product_cat', array('fields' => 'slugs') );

    // Loop through cart items
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ){

        // Check if the product category of the current product don't match with a cart item
        if( ! has_term( $term_slugs, 'product_cat', $cart_item['product_id'] ) ){

            // Displaying a custom notice
            wc_add_notice( __('Only items from one product category are allowed in cart'), 'error' );

            // Avoid add to cart
            return false; // exit
        }
    }
    return $passed;
}

Код находится в файле function.php активной дочерней темы (или активной темы). Проверено и работает.


Дополнение (обновлено). То же самое, но только для родительских категорий товаров:

add_filter( 'woocommerce_add_to_cart_validation', 'only_one_product_category_allowed', 20, 3 );
function only_one_product_category_allowed( $passed, $product_id, $quantity) {
    $parent_term_ids = $item_parent_term_ids = array(); // Initializing

    // Loop through the current product category terms to get only parent main category term
    foreach( get_the_terms( $product_id, 'product_cat' ) as $term ){
        if( $term->parent > 0 ){
            $parent_term_ids[] = $term->parent; // Set the parent product category
        }
    }

    // Loop through cart items
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ){
        // Loop through the cart item product category terms to get only parent main category term
        foreach( get_the_terms( $cart_item['product_id'], 'product_cat' ) as $term ){
            if( $term->parent > 0 ){
                $item_parent_term_ids[] = $term->parent; // Set the parent product category
            }
        }

        // Check if parent product categories don't match
        if( ! array_intersect( $parent_term_ids, $item_parent_term_ids ) ){

            // Displaying a custom notice
            wc_add_notice( __('Only items from one product category are allowed in cart'), 'error' );

            // Avoid add to cart
            return false; // exit
        }
    }
    return $passed;
}

Код находится в файле function.php активной дочерней темы (или активной темы). Проверено и работает.

person LoicTheAztec    schedule 26.09.2018
comment
Есть ли способ заставить его работать с родительскими категориями, а не с вложенными? - person Isaac Byrne; 26.09.2018
comment
Большое спасибо! и жаль, что я оставил это. Не понимал этого, пока не протестировал этот код. - person Isaac Byrne; 26.09.2018
comment
Только один уровень подкатегории. Продукты - › Вложенные типы товаров (рубашки, носки и т. д.) и рабочие формы (без вложенных категорий) - person Isaac Byrne; 26.09.2018
comment
@IsaacByrne Я добавил код после того, как… проверьте его, чтобы убедиться, что это то, что вам нужно. - person LoicTheAztec; 26.09.2018
comment
Работает отлично! Спасибо еще раз! - person Isaac Byrne; 26.09.2018
comment
@KGR Извините, но этот код работает для этой конкретной темы (вопрос)… Теперь ваш случай отличается, поэтому вам нужно сделать что-то, что будет соответствовать вашим потребностям… После того, как вы попытались сделать что-то нестандартное для своих нужд, если вам нужна помощь по вашему заказу код, вы можете задать новый вопрос на StackOverFlow, предоставив свой собственный код с пояснениями и ссылками на темы, которые вас вдохновили. Также поищите еще немного, так как есть много похожих тем… Но, пожалуйста, не приходите сюда и не говорите, что это не работает - person LoicTheAztec; 30.06.2020
comment
@KGR Сначала выполните поиск еще раз и, прежде чем спрашивать, попробуйте решить свое требование самостоятельно, сделав попытки собственного кода. Затем, если нужно, вы зададите вопрос по собственному коду. - person LoicTheAztec; 30.06.2020