Установите нулевую стоимость всех способов доставки для купона на бесплатную доставку в Woocommerce.

У меня в корзине 3 способа доставки, цены на которые должны стать нулевыми, как только ваш клиент введет купон на бесплатную доставку.

Я знаю, как добавить фильтр в functions.php для обнаружения купона, но знает ли кто-нибудь фрагмент кода для установки НУЛЯ для методов доставки, видимых в корзине (переключатель) для этого заказа?

Мои методы доставки - это такие компании, как UPS, FedEx ...

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

Список возможных способов доставки для клиентов рассчитывается в соответствии с классом доставки моей продукции и общим весом заказа.

Класс доставки не рассчитывается, а устанавливается по продукту, и я использую ПЛАГИН ТАБЛИЧНОЙ СТАВКИ для расчета веса.

Большое спасибо


person Community    schedule 07.02.2018    source источник
comment
спасибо, но это наоборот, что я хочу ... если мой купон позволяет использовать метод бесплатной доставки, я не могу позволить клиенту выбрать способ доставки.   -  person    schedule 07.02.2018
comment
когда способы доставки отображаются в корзине, предлагая покупателю выбрать один с переключателем, мне нужно установить для всех их цен значение 0, если применяется купон   -  person    schedule 07.02.2018


Ответы (2)


Первый способ бесплатной доставки должен быть включен с опцией «Действительный купон на бесплатную доставку»…

Затем вам необходимо установить желаемые коды купонов с включенной опцией «Разрешить бесплатную доставку».

Следующий код установит для всех методов доставки значение ноль, если будет применен действительный код купона (с включенной опцией «Разрешить бесплатную доставку»).

Обновление: скройте метод "Бесплатная доставка" и добавьте названия ярлыков доставки с помощью "(free)"

add_filter( 'woocommerce_package_rates', 'coupon_free_shipping_customization', 20, 2 );
function coupon_free_shipping_customization( $rates, $package ) {
    $has_free_shipping = false;

    $applied_coupons = WC()->cart->get_applied_coupons();
    foreach( $applied_coupons as $coupon_code ){
        $coupon = new WC_Coupon($coupon_code);
        if($coupon->get_free_shipping()){
            $has_free_shipping = true;
            break;
        }
    }

    foreach( $rates as $rate_key => $rate ){
        if( $has_free_shipping ){
            // For "free shipping" method (enabled), remove it
            if( $rate->method_id == 'free_shipping'){
                unset($rates[$rate_key]);
            }
            // For other shipping methods
            else {
                // Append rate label titles (free)
                $rates[$rate_key]->label .= ' ' . __('(free)', 'woocommerce');

                // Set rate cost
                $rates[$rate_key]->cost = 0;

                // Set taxes rate cost (if enabled)
                $taxes = array();
                foreach ($rates[$rate_key]->taxes as $key => $tax){
                    if( $rates[$rate_key]->taxes[$key] > 0 )
                        $taxes[$key] = 0;
                }
                $rates[$rate_key]->taxes = $taxes;
            }
        }
    }
    return $rates;
}

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

Проверено и работает. Это должно работать и для вас.

Иногда может потребоваться обновить способы доставки:
1) Сначала очистите корзину.
2) Перейдите в настройки зон доставки, затем отключите / сохраните и повторно включите / сохраните связанные способы доставки.

person LoicTheAztec    schedule 07.02.2018
comment
Код @Pipoo протестирован и обновлен ... После сохранения этого кода обновите способы доставки, как описано в конце ... - person LoicTheAztec; 07.02.2018

Если вы хотите добиться того же, но всякий раз, когда доступен метод бесплатной доставки (не только примененный купон, но и общая сумма корзины выше определенной цены), вы можете использовать это:

add_filter( 'woocommerce_package_rates', 'wc_apply_free_shipping_to_all_methods', 10, 2 );
function wc_apply_free_shipping_to_all_methods( $rates, $package ) {
  if( isset( $rates['free_shipping:11'] ) ) { 
    unset( $rates['free_shipping:11'] );
    foreach( $rates as $rate_key => $rate ) { 
                // Append rate label titles (free)
                $rates[$rate_key]->label .= ' ' . __('(free)', 'woocommerce');

                // Set rate cost
                $rates[$rate_key]->cost = 0;

                // Set taxes rate cost (if enabled)
                $taxes = array();
                foreach ($rates[$rate_key]->taxes as $key => $tax){
                    if( $rates[$rate_key]->taxes[$key] > 0 )
                        $taxes[$key] = 0;
                }
                $rates[$rate_key]->taxes = $taxes;
    }   
  }
  return $rates;
}

Обратите внимание, что после free_shipping стоит :11. До WooCommerce 2.6 сведения о способе доставки «Бесплатная доставка» хранились в элементе массива $rates['free_shipping']. Однако теперь он хранится как $rates['free_shipping:shipping_zone_instance_id'], где shipping_zone_instance_id - это идентификатор экземпляра зоны доставки для метода доставки. Вы можете проверить идентификатор экземпляра способа доставки, проверив «Бесплатная доставка» в панели администратора или открыв его в новой вкладке и просмотрев URL-адрес http://prntscr.com/jd2zjy.

person Michał Burda    schedule 03.05.2018
comment
Это не способ поблагодарить за фрагмент… Ваш ответ не отвечает на исходный вопрос, и его следует удалить. Это строго основано на моем коде без части купона, которая задавалась в этом вопросе. Это действительно нечестно. Вместо этого вам следовало задать новый вопрос ... - person LoicTheAztec; 04.05.2018
comment
@LoicTheAztec, я думал, что кто-то оценит более универсальное решение. Разве не очевидно, что это ваш код, но подправленный? Вы хотите, чтобы я отметил вас в своем ответе? Я действительно не имею в виду неуважение - person Michał Burda; 04.05.2018
comment
Вы спросили здесь в удаленном ответе: спасибо за этот классный фрагмент! Не могли бы вы рассказать мне, как отредактировать этот код, чтобы он работал с бесплатной доставкой сверх определенной общей стоимости корзины? Итак, это ответ на ваш вопрос ... но он не отвечает на вопрос, заданный в этой ветке ... if( isset( $rates['free_shipping:11'] ) ) { unset( $rates['free_shipping:11'] ); не универсален и связан к вашей конкретной проблеме ... - person LoicTheAztec; 04.05.2018