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