удалить товары категории из общего количества корзины woocommerce

Я создаю свою электронную коммерцию для продажи вина с помощью wordpress 4.2.2 и woocommerce 2.3.11. Я создал специальную функцию для завершения заказа только с бутылками, кратными 6. До этого у меня нет никаких проблем, но у меня есть 2 категории с упаковками по 6 бутылок, поэтому я хочу избежать того, чтобы эти 2 категории учитывались в общее количество товаров в корзине. Я не разбираюсь в php, поэтому я пытаюсь создать функцию, которая проверяет, находится ли каждый элемент внутри категории, и, если он принадлежит к одной категории пакетов, вычитает один элемент. Это работает хорошо, только если есть один товар из этих двух категорий, но если я добавлю 2 пакета в корзину, только один будет вычтен.

add_action( 'woocommerce_check_cart_items', 'woocommerce_check_cart_quantities' );
function woocommerce_check_cart_quantities() {
$total_products = WC()->cart->cart_contents_count;
$multiples = 6;
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
    $prodotti = $values['data'];
    $terms = get_the_terms ($prodotti->id, 'product_cat');
    foreach ($terms as $term){
        $categoria = $term->term_id;
    }   

    if (($categoria == 169) || ($categoria == 152)) {
            $pacchetti = $values ['quantity'];  
            $totale = ($total_products-$pacchetti);
    } else {
        $totale = $total_products;
    }
}
echo $totale;
if ( ( $totale % $multiples ) > 0 )
    wc_add_notice( sprintf( __('You need to buy in quantities of 6 products', 'woocommerce'), $multiples ), 'error' );

}    

Желаемый подсчет:

Экран 1 - правильный подсчет

Существующий подсчет

Экран 2 - неправильный подсчет

Я открыт для любого решения, чтобы это работало.

Большое спасибо!


person Wolftrick    schedule 13.01.2016    source источник
comment
Мне придется подумать об этом подробнее, но как насчет использования пакетов продуктов для предметы, которые нужно продавать упаковками по 6 штук?   -  person helgatheviking    schedule 14.01.2016
comment
Привет еще раз :). Пакеты продуктов вообще не работают :(, также с вашей предыдущей помощью. Я также нанимаю внештатного сотрудника, но безуспешно. Поэтому я отказался от идеи использовать его, и с сегодняшнего дня я много работаю над поиском другого решения с приведенным выше кодом .   -  person Wolftrick    schedule 14.01.2016
comment
Почему не работают наборы продуктов? Судя по вашему описанию, это похоже на ваш вариант использования. И, к сожалению, не всегда удается нанять хорошего фрилансера. Со мной такое тоже случалось раньше. Для проектов, связанных с WooCommerce, вам, вероятно, будет хорошо нанять Woo Expert.   -  person helgatheviking    schedule 14.01.2016
comment
Теперь по поводу вашего вопроса ... Чтобы уточнить: общее количество в корзине всегда должно быть кратным 6? Значит, вы могли купить 3 бутылки красного вина и 3 бутылки белого вина? Но выбор La Ns уже состоит из 6 и не должен засчитываться в эту сумму? Дай мне посмотреть, что я могу придумать.   -  person helgatheviking    schedule 14.01.2016
comment
У продуктовых наборов есть проблема, которая учитывает также набор на общее количество товаров в корзине. В любом случае ... именно отдельные бутылки необходимо покупать всегда несколькими партиями по 6 штук (для сделки с нашим перевозчиком). Но у нас также есть две категории: - confezioni = идентификатор категории 152 - сумка в коробке = идентификатор категории 169. В этих двух категориях мы создаем группу продуктов (всегда 6/12 бутылок для продукта), чтобы покупатель мог покупать только один товар из этой 2-х категорий.   -  person Wolftrick    schedule 14.01.2016
comment
С моим кодом подсчет правильный, но только если я добавлю только 1 продукт из этих 2 категорий. Если я добавляю в корзину более 1 продукта из этой категории, вычитается только 1 (всегда последний в списке корзины).   -  person Wolftrick    schedule 14.01.2016
comment
Думаю, я понял. Пожалуйста, проверьте мой ответ.   -  person helgatheviking    schedule 14.01.2016


Ответы (1)


Мне ваш код выглядит очень хорошо. Я думаю, что единственное, чего вам не хватает, - это функции has_term(), чтобы более надежно проверить, какие продукты находятся в вашем две особые категории.

add_action( 'woocommerce_check_cart_items', 'woocommerce_check_cart_quantities' );
function woocommerce_check_cart_quantities() {
    $total_products = WC()->cart->cart_contents_count;
    $multiples = 6;
    $totale = 0;
    foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
        $prodotti = $values['data'];

        if( ! has_term( array( 169, 152 ), 'product_cat', $prodotti->id ) ){
            $totale += $values['quantity'];
        } 

    }
    echo $totale;
    if ( ( $totale % $multiples ) > 0 ){
        wc_add_notice( sprintf( __('You need to buy in multiples of %d products', 'your-textdomain'), $multiples ), 'error' );
    }

}
person helgatheviking    schedule 14.01.2016
comment
УДИВИТЕЛЬНЫЙ! Это прекрасно работает! Сегодня вечером ты спасешь мне жизнь, я куплю тебе маргариту :) Могу я спросить ... почему мой код не работает? (Я хочу узнать как можно больше) - person Wolftrick; 14.01.2016
comment
Большой! Не забудьте отметить это как принятый ответ. И спасибо за эту маргариту. Если бы мне пришлось угадывать, почему ваш код не работает, я думаю, это мог быть цикл foreach(). Если ваш продукт относится к нескольким категориям, тогда $categoria = $term->term_id; произвольно соответствует последней категории в $terms. И это сделало бы ваше if() заявление ненадежным. - person helgatheviking; 14.01.2016
comment
аааа ладно понятно! Еще раз спасибо - person Wolftrick; 14.01.2016