Скидка на стоимость доставки на основе классов доставки в Woocommerce

Я пытаюсь применить скидку к одному классу доставки для продуктов, которые в настоящее время находятся в корзине. Это применяется к просмотру оформления заказа.

В бэкэнде Woocommerce опция настроена на индивидуальную оплату каждого класса доставки. Кроме того, я использую только один способ доставки - "фиксированная ставка".

На основании Переопределить все расходы по доставке для определенного класса доставки в Woocommerce следующий код, который должен применить скидку:

add_filter('woocommerce_package_rates', 'shipping_class_null_shipping_costs', 10, 2);
function shipping_class_null_shipping_costs( $rates, $package ){

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

    $shipping_class_slug = 'large'; // Your shipping class slug
    $found = false;

    // Loop through cart items and checking for the specific defined shipping class
    foreach( $package['contents'] as $cart_item ) {
        if( $cart_item['data']->get_shipping_class() == $shipping_class_slug )
            $found = true;
    }
    $percentage = 50; // 50%
    $subtotal = WC()->cart->get_cart_shipping_total();

    // Set shipping costs to 50% discount if shipping class is found
    if( $found ){
        foreach ( $rates as $rate_key => $rate ){
            $has_taxes = false;

            // Targetting "flat rate"
            if( 'flat_rate' === $rate->method_id ){
                $rates[$rate_key]->cost = $subtotal;
            }
        }       
    }
    return $rates;
}

Но что бы я ни попробовал, расчетный результат доставки - 0 долларов.

Что я здесь делаю не так и как правильно применить скидку к классу доставки?

Спасибо.


person Mario83    schedule 20.10.2018    source источник
comment
@LoicTheAztec, спасибо за ваш вклад! Я буду уделять этому больше внимания в будущем.   -  person Mario83    schedule 20.10.2018


Ответы (1)


Обновить (только о настройках)

Чтобы добавить скидку только для большого класса доставки при фиксированной ставке доставки, Вам необходимо:

  • Установите цену со скидкой непосредственно на стоимость вашего способа доставки.
  • Включите параметр По классу: взимать плату за доставку для каждого класса доставки отдельно

Нравиться:

введите описание изображения здесь


Исходный ответ:

Следующий код устанавливает стоимость доставки в размере 50% для метода доставки по фиксированной ставке, если в элементах корзины обнаруживается определенный определенный метод доставки.

Тестирование: временно Включите режим отладки в настройках доставки на вкладке Параметры доставки ...

Настройки единой ставки доставки. Необходимо определить стоимость классов доставки.

В приведенном ниже коде определите для каждой функции ярлык класса доставки и пользовательское уведомление:

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

    // Your settings below
    $shipping_class = 'large'; // <=== Shipping class slug
    $percentage     = 50; //      <=== Discount percentage

    $discount_rate  = $percentage / 100;
    $is_found       = false;

    // Loop through cart items and checking for the specific defined shipping class
    foreach( $package['contents'] as $cart_item ) {
        if( $cart_item['data']->get_shipping_class() == $shipping_class )
            $is_found = true;
    }

    // Set shipping costs to 50% if shipping class is found
    if( $is_found ){
        foreach ( $rates as $rate_key => $rate ){
            $has_taxes = false;
            // Targeting "flat rate"
            if( 'flat_rate' === $rate->method_id  ){
                $rates[$rate_key]->cost = $rate->cost * $discount_rate;

                // Taxes rate cost (if enabled)
                foreach ($rates[$rate_key]->taxes as $key => $tax){
                    if( $tax > 0 ){
                        $has_taxes = true;
                        $taxes[$key] = $tax * $discount_rate;
                    }
                }
                if( $has_taxes )
                    $rates[$rate_key]->taxes = $taxes;
            }
        }
    }
    return $rates;
}

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

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

person LoicTheAztec    schedule 20.10.2018
comment
Спасибо за помощь. Это действительно добавляет скидку, однако она применяет скидку к сумме всех классов доставки в тележке. Похоже, что определение класса доставки в коде $shipping_class = 'large'; не влияет на итоги. Как такое возможно? - person Mario83; 20.10.2018
comment
Это странная часть, потому что у меня уже были классы доставки точно так, как вы предложили на скриншотах. «Большой» = 200 долларов США; «Маленький» = 150 долларов США; Доставка по классу. Но при оформлении заказа стоимость доставки составляет 175 долларов, что составляет 50% скидку для обоих классов в сумме; 200 + 150/2 = 175. Глядя на предоставленный вами код, я также не вижу, в чем может быть проблема. Есть другие идеи? Большое спасибо! - person Mario83; 20.10.2018
comment
@ Mario83 По мне, он отлично работает с предоставленными настройками: добавляется стоимость класса доставки каждого товара и составляет правильную общую стоимость… Так что есть еще кое-что, что создает проблемы в вашей установке и настройках. - person LoicTheAztec; 20.10.2018
comment
Хотел бы я сказать то же самое. Я тестировал это на двух локальных и одной живой среде с базовыми установками WP - не повезло. Он продолжает дисконтировать сумму вместо одного класса доставки. Я углублюсь в это завтра и поделюсь своим прогрессом и возможным решением. - person Mario83; 20.10.2018
comment
@Mario Вам не нужен код, только настройки, ввод стоимости со скидкой прямо в вашем «большом» классе доставки. Итак, если «маленький» = 150 долларов… «большой» (со скидкой) = 100 долларов (50% от 200 долларов)… если оба они находятся в корзине, у вас будет 150 + 100 = 250 долларов. - person LoicTheAztec; 20.10.2018
comment
да, это действительно работает! Однако это лишь часть более сложного решения, которое мне нужно реализовать. Если я могу поделиться, мне нужно следующее поведение: за товар в корзине с самым дорогим классом доставки должна быть начислена 100% плата. На все остальные классы доставки в тележке пользователя должна быть скидка 50%. Наконец, у меня есть 5 продуктов с уникальными классами доставки, которые никогда не следует сбрасывать со счетов, даже если они не самого высокого класса в корзине. Итак, моя идея заключалась в том, чтобы найти способ установить скидку для любого класса доставки и продолжить свой путь оттуда. Надеюсь, это имеет смысл. - person Mario83; 22.10.2018
comment
Привет, Лоик. Моя обратная связь по редактированию этого ответа заключается в том, что использование блоков цитат для чего-либо, кроме кавычек, семантически некорректно - есть сильная параллель с неправильным использованием ‹blockquote› в качестве общего маркера. Я не уверен, что подача апелляции - это хорошее использование времени модератора, но, пожалуйста, обратите внимание на мое несогласие. - person halfer; 01.11.2020
comment
Я также не рекомендую добавлять примечания к редактированию в обратном хронологическом порядке - просить читателей сначала прочитать последнюю часть, вероятно, сбивает с толку. Единственный способ увидеть, что это лучший подход, - это если исходный ответ будет переписан как альтернативный подход или даже как сноска - возможно, в таких случаях не важно давать понять, что сообщение было отредактировано вообще. В конце концов, есть история редактирования, которую читатели могут увидеть, если захотят. - person halfer; 01.11.2020
comment
Это абсолютно повод для голосования против. Честно говоря, я был в двух мнениях по поводу своего отрицательного голоса и попытался отозвать его, но система заморозила его. У вас чрезвычайно высокая репутация, поэтому я предлагаю вам просто пережить это как естественное следствие отказа от терпеливого и тщательного редактирования. работать без обсуждения. Излишне говорить, что редакторы не могут спрашивать, прежде чем вносить правки - это было бы совершенно немыслимо. - person halfer; 02.11.2020
comment
Как я люблю говорить, мои двери открыты для гражданской обратной связи - я всегда могу обосновать свои правки, и сделал это здесь подробно. Если вы не согласны с моими рассуждениями, я буду рад узнать почему. В общем, если кто-то редактирует вашу работу, стоит сначала связаться с ним, прежде чем откатиться - это значительно упростит общение. - person halfer; 02.11.2020