Условно ограничьте 1 товар в корзине из определенной подкатегории товаров


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

Код:

add_filter( 'woocommerce_add_cart_item_data', 'woo_custom_add_to_cart' );

function woo_custom_add_to_cart( $cart_item_data ) {
global $woocommerce;
$woocommerce->cart->empty_cart();

return $cart_item_data;
}

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

Как я мог бы достичь это?

Спасибо.

Author: LoicTheAztec, 2016-12-06

1 answers

Обновлено (октябрь 2018)

Крючок woocommerce_add_cart_item_data используемые в вашем коде и $woocommerce->cart->empty_cart();, которые полностью очистят все товары в корзине, не подходят для того, что вы просите. Кроме того, этот код какой-то старомодный.

Чтобы получить то, что вам нужно, вместо этого попробуйте этот код (для его работы вам нужно установить свой идентификатор подкатегории):

add_action( 'woocommerce_before_calculate_totals', 'one_subcategory_cart_item', 10, 1 );
function one_subcategory_cart_item( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Set HERE your subcategory (can be an ID, a slug or the name)
    $subcategory       = 't-shirts';
    $count_subcategory = 0;

    // First cart loop: Counting number of subactegory items in cart 
    foreach ( $cart->get_cart() as $cart_item )
        if( has_term( $subcategory, 'product_cat', $cart_item['product_id'] ) )
            $count_subcategory++;

    // Second cart loop: Removing subcategory items if more than one (keeping the last one)
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if( $count_subcategory > 1 ) {
            $cart->remove_cart_item( $cart_item_key );
            break;
        }
    }
}

Этот код протестирован и полностью работоспособен.

Код входит в function.php файл вашей активной дочерней темы (или темы). Или также в любых файлах php плагина.

 2
Author: LoicTheAztec, 2018-10-01 06:03:39