Ограничение товаров в корзине из одной и той же категории товаров


Я использую приведенный ниже код для удаления других товаров категории товаров WooCommerce из корзины, когда в корзину добавлен товар со специальной категорией товаров "cat_x" и отображаются некоторые другие пользовательские уведомления. Код пришел от эта нить и просто хорошо работает:

add_action( 'woocommerce_check_cart_items', 'checking_cart_items' );
function checking_cart_items() {
    $special = false;
    $catx = 'cat_x';
    $number_of_items = sizeof( WC()->cart->get_cart() );

    if ( $number_of_items > 0 ) {

        // Loop through all cart products
        foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
            $item = $values['data'];
            $item_id = $item->id;

            // detecting if 'cat_x' item is in cart
            if ( has_term( $catx, 'product_cat', $item_id ) ) {
                if (!$special)
                    $special = true;
            }
        }

        // Re-loop through all cart products
        foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
            $item = $values['data'];
            $item_id = $item->id;

            if ( $special ) // there is a 'cat_x' item in cart
            { 
                if ( $number_of_items == 1 ) { // only one 'cat_x' item in cart
                    if ( empty( $notice ) )
                        $notice = '1';
                }
                if ( $number_of_items >= 2 ) { // 'cat_x' item + other categories items in cart
            // removing other categories items from cart
                    if ( !has_term( $catx, 'product_cat', $item_id ) ) {
                        WC()->cart->remove_cart_item( $cart_item_key ); // removing item from cart
                        if ( empty( $notice ) || $notice == '1' )
                            $notice = '2';
                    }
                }
            } else { // Only other categories items
                if ( empty( $notice ) )
                    $notice = '3';
            }
        }

        // Firing notices
        if ( $notice == '1' ) { // message for an 'cat_x' item only (alone)
            wc_add_notice( sprintf( '<p class="woocommerce-error">bla bla bla one category X item in the cart</p>' ), 'success' );
        } elseif ( $notice == '2' ) { // message for an 'cat_x' item and other ones => removed other ones 
            wc_add_notice( sprintf( '<p class="woocommerce-error">bla bla bla ther is already category X in the cart => Other category items has been removed</p>' ), 'error' );
        } elseif ( $notice == '3' ) { // message for other categories items (if needed)
            wc_add_notice( sprintf( '<p class="woocommerce-error">bla bla bla NOT category X in the cart</p>' ), 'success' );
        }
    }
} 

Имеет условную функцию has_term() работает также с массивами категорий, я попытался вместо одной категории установить массив категорий в этом коде. Но это не работает.

Однако мои потребности изменились: я не хочу, чтобы у клиента была возможность выбирать товары в корзине из разных категорий. Таким образом, в корзине всегда должны быть товары из одной и той же категории товаров.

Какая-нибудь помощь, пожалуйста?

Спасибо.

Author: Community, 2017-02-22

1 answers

Создание пользовательской функции, подключенной к крючку фильтра woocommerce_add_to_cart_validation, позволит выполнить эту работу гораздо более простым способом, без необходимости устанавливать массив категорий.

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

Этот код позволит избежать добавления в корзину, если в корзине находится товар другой категории:

add_filter( 'woocommerce_add_to_cart_validation', 'custom_checking_product_added_to_cart', 10, 3 );
function custom_checking_product_added_to_cart( $passed, $product_id, $quantity) {

    // HERE Type your alert displayed message
    $message = __( 'BLA BLA YOUR MESSAGE.', 'woocommerce' );

    $product_cats_object = get_the_terms( $product_id, 'product_cat' );
    foreach($product_cats_object as $obj_prod_cat){
        $product_cats[] = $obj_prod_cat->slug;
    }

    foreach (WC()->cart->get_cart() as $cart_item ){
        if( ! has_term( $product_cats, 'product_cat', $cart_item['product_id'] )) {
            $passed = false;
            wc_add_notice( $message, 'error' );
            break;
        }
    }
    return $passed;
}

Код входит в function.php файл вашего активного ребенка тема (или тема) или также в любом файле плагина.

Этот код протестирован, и он работает


Ограничение товаров в корзине только из разных категорий товаров:

Замените в функции условие:

if( ! has_term( $product_cats, 'product_cat', $cart_item['product_id'] )) { 

По

if( has_term( $product_cats, 'product_cat', $cart_item['product_id'] )) {
 3
Author: LoicTheAztec, 2017-03-16 18:07:51