Intereting Posts
Печать горизонтальной таблицы вместо вертикальной, используя PHP Laravel 4: установите флажок, по крайней мере, один Расширенный поиск Magento не возвращает результатов Могу ли я просто выбрать один столбец в MYSQL вместо всех, чтобы сделать его быстрее? Не удается включить файл на удаленном сервере возможно ли создать дубликат ip в этом коде? Сравнение временных меток с переменной даты (MySQL и PHP) Передача параметров GET через htaccess + Codeigniter Разница между URL-адресом URL-адреса CodeIgniter и базовым URL-адресом Почему спецификация ISO-8601 выглядит повсеместно игнорируемой, когда речь идет о десятичных знаках? Есть ли способ скомпилировать шаблон ножа из строки? CodeIgniter: пытается вызвать метод конструктора, чтобы проверить, зарегистрирован ли пользователь (вызывает бесконечный цикл перенаправления) Важно ли явно декларировать свойства в PHP? Как удалить файлы или изображения из папки и базы данных в Laravel? Функция изображения в PHP

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

Я использую приведенный ниже код, чтобы удалить другие предметы из категории товаров 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 () работает также с массивами категорий, я попытался вместо одной категории установить массив категорий в этом коде. Но это не работает .

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

Любая помощь, пожалуйста?

Благодарю.

Создание пользовательской функции, подключенной в 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'] )) {