Установите количество товаров, кратное «x», для продуктов в определенных категориях в WooCommerce.

Я пытаюсь отобразить предупреждающее сообщение на странице корзины моего веб-сайта, управляя двумя разными кратными количествами для двух разных категорий.

Категории:

  • Birre 33 cL (slug: birre-33-cl ID:187) для нескольких количеств 6
  • Birre 75 cL (slug: birre-75-cl ID:188) для нескольких количеств 12

Мне нужно считать и управлять ими отдельно (вы можете купить 12/24/36... бутылок по 33 мл и 6/12/18... бутылок по 75 мл, но не 6 бутылок по 33 сл и 6 бутылок по 75 мл). кл).

Я изменил этот код в соответствии с моими потребностями:

//FILL THE BOX BIRRE 33 CL
function has_product_category( $product_id, $category_ids ) {
    $term_ids = array(); 

    // 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 ){
            $term_ids[] = $term->parent; // Set the parent product category
            $term_ids[] = $term->term_id;
        } else {
            $term_ids[] = $term->term_id;
        }
    }
    return array_intersect( $category_ids, array_unique($term_ids) );
}

add_action( 'woocommerce_check_cart_items', 'woocommerce_check_cart_quantities' );
function woocommerce_check_cart_quantities() {
    $multiples = 12;
    $total_products = 0;
    $category_ids = array( 187 );
    $found = false;

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( has_product_category( $cart_item['product_id'], $category_ids ) ) {
            $total_products += $cart_item['quantity'];
            $found = true;
        }
    }
    if ( ( $total_products % $multiples ) > 0 && $found )
        wc_add_notice( sprintf( __('FILL YOUR 33 cL BOX: you have to buy multiples of %s.', 'woocommerce', 'woocommerce'), $multiples ), 'error' );
}

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

Любая помощь приветствуется.


person 2sr    schedule 19.03.2021    source источник


Ответы (1)


Обновлено

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

add_action( 'woocommerce_check_cart_items', 'woocommerce_check_cart_quantities' );
function woocommerce_check_cart_quantities() {
    $term_names_1 = array('Birre 75 cL'); // 1st array of term names
    $term_names_2 = array('Birre 33 cL'); // 2nd array of term names
    $multiples_6  = 6;  // 1st multiples (for 75 cl)
    $multiples_12 = 12; // 2nd multiples (for 33 cl)
    
    $total_products_1 = $total_products_2 = 0; // Initializing
    
    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // count items | 75 cl (by 6)
        if ( has_product_categories( $cart_item['product_id'], $term_names_1 ) ) {
            $total_products_1 += $cart_item['quantity'];
        }
        // count items | 33 cl (by 12)
        elseif ( has_product_categories( $cart_item['product_id'], $term_names_2 ) ) {
            $total_products_2 += $cart_item['quantity'];
        }
    }
    
    // Notice for 75 cl (by 6) 
    if ( $total_products_1 > 0 && ( $total_products_1 % $multiples_6 ) > 0 ) {
        wc_add_notice( sprintf( 
            __('You need to buy in quantities of %s items from %s %s'), 
            $multiples_6, explode(', ', $term_names_1), _n('category', 'categories', count($multiples_6))
        ), 'error' );
    }
    
    // Notice for 33 cl (by 12) 
    if ( $total_products_2 > 0 && ( $total_products_2 % $multiples_12 ) > 0 ) {
        wc_add_notice( sprintf( 
            __('You need to buy in quantities of %s items from %s %s'), 
            $multiples_12, explode(', ', $term_names_2), _n('category', 'categories', count($multiples_12))
        ), 'error' );
    }  
}

// Custom conditional function that handle parent product categories too
function has_product_categories( $categories, $product_id = 0 ) {
    $parent_term_ids = $categories_ids = array(); // Initializing
    $taxonomy        = 'product_cat';
    $product_id      = $product_id == 0 ? get_the_id() : $product_id;

    if( is_string( $categories ) ) {
        $categories = (array) $categories; // Convert string to array
    }

    // Convert categories term names and slugs to categories term ids
    foreach ( $categories as $category ){
        $result = (array) term_exists( $category, $taxonomy );
        if ( ! empty( $result ) ) {
            $categories_ids[] = reset($result);
        }
    }

    // Loop through the current product category terms to get only parent main category term
    foreach( get_the_terms( $product_id, $taxonomy ) as $term ){
        if( $term->parent > 0 ){
            $parent_term_ids[] = $term->parent; // Set the parent product category
            $parent_term_ids[] = $term->term_id; // (and the child)
        } else {
            $parent_term_ids[] = $term->term_id; // It is the Main category term and we set it.
        }
    }
    return array_intersect( $categories_ids, array_unique($parent_term_ids) ) ? true : false;
}

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

person LoicTheAztec    schedule 19.03.2021
comment
Большое спасибо за Вашу помощь! Изначально код, который вы написали, не работал на моем сайте: в корзине не отображалось уведомление при любом количестве обеих категорий! Затем я пытаюсь изменить $term_names_1/2 на $category_ids_1/2 и теперь работает отлично! - person 2sr; 20.03.2021
comment
@2sr Ой извините! … Я изменил функцию has_product_category() на лучшую функцию has_product_categories(), которая обрабатывает названия категорий продуктов, ярлыки или идентификаторы. Теперь это работает просто отлично. Если этот ответ отвечает на ваш вопрос, вы можете принять ответ. Спасибо. - person LoicTheAztec; 20.03.2021
comment
Извините, но я не могу заставить работать отредактированный код. Только решение, которое я написал вам в своем первом комментарии, работает на моем сайте (поэтому старый код с category_ids). Новый не работает ни с именами категорий, ни с слагами, ни с изменением category_id. - person 2sr; 20.03.2021