Скрыть способы доставки на основе атрибута продукта Variation в WooCommerce

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

Я пытаюсь отключить какой-либо способ доставки на основе атрибута продукта, выбранного в варианте. Например, если выбран атрибут продукта «a», то на странице корзины должен отображаться только способ доставки 1, а если выбран атрибут продукта «b», в корзине должен отображаться способ доставки 2.

Я не знаю, как мне это сделать.


person Somy J    schedule 17.03.2019    source источник
comment
Вы что-нибудь пробовали?   -  person mujuonly    schedule 17.03.2019


Ответы (1)


Следующий код скроет определенные методы доставки на основе условий атрибута продукта вариации продукта, определенных как настройки, в приведенном ниже коде:

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_variation_product_attribute', 10, 2 );
function hide_shipping_method_based_on_variation_product_attribute( $rates, $package ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE define the Product Attibute taxonomy (starts always with "pa_")
    $taxonomy = 'pa_color'; // Example for "Color"

    // HERE define shipping method rate ID to be removed from product attribute term(s) slug(s) (pairs) in this array
    $data_array = array(
        'flat_rate:12'      => array('blue'),
        'local_pickup:13'   => array('black', 'white'),
    );

    // Loop through cart items
    foreach( $package['contents'] as $cart_item ){
        if( isset($cart_item['variation']['attribute_'.$taxonomy]) ) {
            // The product attribute selected term slug
            $term_slug = $cart_item['variation']['attribute_'.$taxonomy];

            // Loop through our data array
            foreach( $data_array as $rate_id => $term_slugs ) {
                if( in_array($term_slug, $term_slugs) && isset($rates[$rate_id]) ) {
                    // We remove the shipping method corresponding to product attribute term as defined
                    unset($rates[$rate_id]);
                }
            }
        }
    }
    return $rates;
}

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

Обновите кеши доставки (обязательно):

  1. Этот код уже сохранен в вашем файле function.php.
  2. Убедитесь, что корзина пуста…
  3. В настройках зоны доставки отключите / сохраните любой способ доставки, затем включите возврат / сохранение.

Готово, и вы можете проверить это.

person LoicTheAztec    schedule 17.03.2019
comment
Привет, Лоик. Повторно редактирование, является ли желтый блок цитатой (например, он написан чужим голосом и взят из книги / цитаты / фильма / руководства / блога и т. Д.)? Мне кажется, что это ваш писательский голос, и все же цель этого устройства - четко обозначить его как цитату. - person halfer; 21.03.2019
comment
Привет, @halfer, спасибо ... Это не совсем мой голос ... Это общая рекомендация Woocommerce при использовании этого конкретного крючка, и ее необходимо выделить, так как без этих манипуляций код не работает. - person LoicTheAztec; 21.03.2019
comment
Райт, спасибо Лоику. Время от времени я вижу, как люди используют блоки цитат в качестве общего маркера, и я стараюсь отговаривать их, поскольку их использование сбивает с толку. - person halfer; 21.03.2019
comment
@halfer Я знаю, и ты хорошо справляешься! … Разработчики не обращают на это столько внимания, они больше сосредоточены на своем коде. - person LoicTheAztec; 21.03.2019