Ограничьте количество товаров WooCommerce в корзине только из одной настраиваемой таксономии

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

function filter_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) {
// If passed
if ( $passed ) {
    
    // If cart is NOT empty when a product is added     
    if ( !WC()->cart->is_empty() ) {
        
        // Set vars
        $current_product_tag_ids = array();
        $in_cart_product_tag_ids = array();
        
        // Get current product categories via product_id
        $current_product_tag_ids = wc_get_product_term_ids( $product_id, 'supplier' );

        // Loop through cart items checking for product categories
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            // Get product categories from product in cart via cart item product id
            $in_cart_product_tag_ids = array_merge( $in_cart_product_tag_ids, wc_get_product_term_ids( $cart_item['product_id'], 'product_cat' ) );
        }
        
        // Removes duplicate values
        $in_cart_product_tag_ids = array_unique( $in_cart_product_tag_ids, SORT_NUMERIC );
        
        // Compare
        $compare = array_diff( $current_product_tag_ids, $in_cart_product_tag_ids );
        
        // Result is NOT empty
        if ( !empty ( $compare ) ) {
            wc_add_notice( 'This product is with a different supplier. Please only order from 1 supplier at a time.', 'error' );
            $passed = false;
        }
    }
}

return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'filter_woocommerce_add_to_cart_validation', 10, 5 );

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

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


person Eagle Agency    schedule 24.06.2020    source источник


Ответы (1)


Следующее позволит добавлять в корзину товары только от одного поставщика:

add_filter( 'woocommerce_add_to_cart_validation', 'only_one_supplier_by_order', 10, 2 );
function only_one_supplier_by_order( $passed, $product_id ) {
    if ( WC()->cart->is_empty() )  
        return $passed;
    
    $taxonomy = 'supplier';
    $term_ids = wp_get_post_terms( $product_id, $taxonomy, ['fields' => 'ids']);

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if( ! has_term( $term_ids, $taxonomy, $cart_item['product_id'] ) ) {
            // Displaying a custom notice
            wc_add_notice( __('This product is with a different supplier. Please only order from 1 supplier at a time.'), 'error' );
            return false; // Avoid add to cart
        }
    }
    return $passed;
}

Теперь, чтобы убедиться, что покупатель не может оформить заказ у разных поставщиков в корзине, вы можете добавить это:

// To be sure (avoiding checkout)
add_action( 'woocommerce_check_cart_items', 'only_one_supplier_by_order_check' );
function only_one_supplier_by_order_check() {
    $taxonomy   = 'supplier';
    $term_names = []; // Initializing

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $terms = wp_get_post_terms( $cart_item['product_id'], $taxonomy );
        if( ! empty($terms) ) {
            $term  = reset($terms);
            
            $term_names[$term->term_id] = $term->name;  
        }
    }

    // Allow only one supplier in cart (avoid checkout for more than one
    if( count( $term_names ) > 1 ) {

        // Displaying a custom notice
        wc_add_notice( __('Only items from one supplier at the time are allowed in cart'), 'error' );
    }
}

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

person LoicTheAztec    schedule 24.06.2020