Отключить другие категории продуктов для элемента корзины из определенной категории в Woocommerce - PullRequest
0 голосов
/ 01 октября 2018

Я разрабатываю интернет-магазин с различными аспектами, первый - это обычный магазин, а второй - ночной пивной сервис.я искал, но не могу найти то, что я ищу;

Во-первых, ночной пивной сервис - это особая категория, которую нельзя заказывать с обычными товарами (если категория 'beerservice' находится в корзине, отключите все остальные категории, которые будут добавлены в корзину).

Эта опция также должна работать наоборот (остальные ват), поэтому, если в корзину добавляется обычный товар, категория 'beerservice' должно быть отключено для добавления в корзину.

Я использую этот код ответа, который я нашел:
Отключить покупки, когда товар из определенной категории продуктов находится в корзине в Woocommerce

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

Я также хотел бы добавить сообщение с указанием времени, например, «Заказ, заказанный в прошлом, не будет доставлен» (не исследовал это), но если это не слишком многобеда.

1 Ответ

0 голосов
/ 02 октября 2018

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

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

Улучшенный код:

// Custom conditional function that checks for parent product categories
function has_parent_term( $product_id ) {
    // HERE set your targeted product category SLUG
    $category_slug = 'beerservice'; //  <====  <====  <====  <====  <====  <====  <====

    // Convert category term slug to term id
    $category_id   = get_term_by('slug', $category_slug, 'product_cat')->term_id;
    $parent_term_ids = array(); // Initializing

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

// Avoid add to cart others product categories when "beerservice" is in cart
add_filter( 'woocommerce_add_to_cart_validation', 'specific_category_avoid_add_to_cart_others', 20, 3 );
function specific_category_avoid_add_to_cart_others( $passed, $product_id, $quantity) {
    if( WC()->cart->is_empty() || has_parent_term( $product_id ) ) {
        return $passed;
    }

    foreach( WC()->cart->get_cart() as $cart_item ){
        if( has_parent_term( $cart_item['product_id'] ) ) {
            wc_add_notice( __('Alert message 1 (avoid add to cart)', 'woocommerce' ), 'error' ); // Display a custom error notice
            return false; // Avoid add to cart
        }
    }
    return $passed;
}

// Remove other items when our specific product is added to cart
add_action( 'woocommerce_add_to_cart', 'conditionally_remove_other_products', 20, 4 );
function conditionally_remove_other_products ( $cart_item_key, $product_id, $quantity, $variation_id ){
    if( has_parent_term( $product_id ) ) {
        foreach( WC()->cart->get_cart() as $item_key => $cart_item ){
            if( ! has_parent_term( $cart_item['product_id'] ) ) {
                WC()->cart->remove_cart_item( $item_key );
                wc_add_notice( __('Alert message 2 (Item removed from cart)', 'woocommerce' ), 'error' ); // Display a custom error notice
            }
        }
    }
}

Код входит в файл function.phpфайл вашей активной дочерней темы (active theme).Протестировано и работает.


Связано: Отключение покупок, когда товар из определенной категории товаров находится в корзине в Woocommerce

...