Стоимость доставки Woocommerce зависит от количества товара для определенного класса доставки.

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

Пример, если у меня в корзине 5 товаров:

  • 2 из них используют класс доставки-1 (дополнительная стоимость доставки составляет 70 долларов США).
  • 3 из них используют класс доставки-2 (дополнительная стоимость доставки составляет 50 долларов США).

Так, если (например) обычная доставка стоит 120 долларов, то доставка должна быть (120 долларов + 290 долларов) = 410 долларов.

add_filter( 'woocommerce_package_rates', 'ph_add_extra_cost_based_on_shipping_class', 10, 2);
if( ! function_exists('ph_add_extra_cost_based_on_shipping_class') ) {
    function ph_add_extra_cost_based_on_shipping_class( $shipping_rates, $package ){

        $handling_fee_based_on_shipping_class = array(
            array(
                'shipping_classes'  =>  array( 'shipping-class-1'),         // Shipping Class slug array
                'adjustment'        => 70,                                  // Adjustment
            ),
            array(
                'shipping_classes'  =>  array( 'shipping-class-2' ),
                'adjustment'        =>  50,
            ),
        );

        $shipping_method_ids = array( 'cologistics-shipping' );     // Shipping methods on which adjustment has to be applied

        $adjustment = null;
        foreach( $package['contents'] as  $line_item ) {
            $line_item_shipping_class = $line_item['data']->get_shipping_class();
            if( ! empty($line_item_shipping_class) ) {
                foreach( $handling_fee_based_on_shipping_class as $adjustment_data ) {
                    if( in_array( $line_item_shipping_class, $adjustment_data['shipping_classes']) ) {
                        $adjustment = ( $adjustment_data['adjustment'] > $adjustment ) ? $adjustment_data['adjustment'] : $adjustment;
                    }
                }
            }
        }

        if( ! empty($adjustment) ) {
            foreach( $shipping_rates as $shipping_rate ) {
                $shipping_method_id = $shipping_rate->get_method_id();
                if( in_array($shipping_method_id, $shipping_method_ids) ) {
                    $shipping_rate->set_cost( (float) $shipping_rate->get_cost() + $adjustment );
                }
            }
        }

        return $shipping_rates;
    }
}

Я буду очень признателен за вашу помощь.

Заранее спасибо!


person Voltaki    schedule 19.03.2020    source источник


Ответы (1)


Обычно для этого не требуется никакого кода ... Вы должны установить способ доставки следующим образом (поэтому сначала удалите код и сохраните):

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

1) Таким образом, вы сохраните 120 как глобальную стоимость в вашем способе доставки.

2) Затем для каждого соответствующего желаемого класса доставки вы добавите в соответствующее поле:

  • [qty]*70 для shipping-class-1
  • [qty]*50 для shipping-class-2
  • Тип расчета: Per class: Charge shipping for each shipping class individually

Это сработает и увеличит стоимость за счет класса чипирования в зависимости от количества товара в тележке.


Для пользовательского метода доставки, основанного на вашем коде, вы должны использовать следующее для обработки количества товара:

add_filter( 'woocommerce_package_rates', 'ph_add_extra_cost_based_on_shipping_class', 10, 2);
if( ! function_exists('ph_add_extra_cost_based_on_shipping_class') ) {
    function ph_add_extra_cost_based_on_shipping_class( $shipping_rates, $package ){

        $handling_fee_based_on_shipping_class = array(
            array(
                'shipping_classes'  =>  array( 'shipping-class-1'),         // Shipping Class slug array
                'adjustment'        => 70,                                  // Adjustment
            ),
            array(
                'shipping_classes'  =>  array( 'shipping-class-2' ),
                'adjustment'        =>  50,
            ),
        );

        $shipping_method_ids = array( 'cologistics-shipping' );     // Shipping methods on which adjustment has to be applied

        $adjustment = 0;

        foreach( $package['contents'] as  $line_item ) {
            $line_item_shipping_class = $line_item['data']->get_shipping_class();
            if( ! empty($line_item_shipping_class) ) {
                foreach( $handling_fee_based_on_shipping_class as $adjustment_data ) {
                    if( in_array( $line_item_shipping_class, $adjustment_data['shipping_classes']) ) {
                        $adjustment += $adjustment_data['adjustment'] * $line_item['quantity'];
                    }
                }
            }
        }

        if( $adjustment > 0 ) {
            foreach( $shipping_rates as $shipping_rate ) {
                $shipping_method_id = $shipping_rate->get_method_id();
                if( in_array($shipping_method_id, $shipping_method_ids) ) {
                    $shipping_rate->set_cost( (float) $shipping_rate->get_cost() + $adjustment );
                }
            }
        }

        return $shipping_rates;
    }
}

Он должен работать с дополнительными затратами на обработку количества автозапчастей…

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

Другие цепочки ответов, связанные с обработкой woocommerce_package_rates.

person LoicTheAztec    schedule 19.03.2020
comment
Привет, LoicTheAztec! Спасибо за быстрый ответ, как всегда. Я пробовал ваш код, но ничего не происходит :( - person Voltaki; 19.03.2020
comment
@LoikTheAztec, действительно, я не могу использовать опцию фиксированной ставки, потому что я использую специальный метод доставки, созданный специально для местной службы доставки под названием Cologistics. Это плагин, разработанный специализированным программистом, который извлекает стоимость доставки с помощью внешнего API. Вот почему я нашел первый код. Как я уже сказал, это работает, но мне нужно умножить его для каждого товара в корзине. Я думал, что это проще :( Большое спасибо за уделенное время. - person Voltaki; 19.03.2020
comment
@Voltaki Я обновил свой ответ, добавив другой код, основанный на вашем… - person LoicTheAztec; 19.03.2020
comment
@LoikTheAztec Да! Это сработало! Вы самые лучшие. Большое спасибо. - person Voltaki; 19.03.2020
comment
@LoikTheAztec Привет, я снова здесь. Как я уже говорил, он работал, но не работает с экземплярами метода доставки. Мне нужно скорректировать цену только для одного конкретного экземпляра. Я пробовал использовать классическую плоскую ставку woocommerce, и она тоже не сработала. Например, если я установил: $ shipping_method_ids = array ('flat_rate'); он корректирует цену для всех настроенных экземпляров с фиксированной ставкой, но когда я меняю ее на: 'flat_rate: 5', он перестает работать и возвращается к исходной стоимости. - person Voltaki; 24.04.2020
comment
В этом случае вам необходимо заменить: $shipping_method_id = $shipping_rate->get_method_id(); на $shipping_method_id = $shipping_rate->get_id(); для обработки полного идентификатора тарифа метода доставки, например flat_rate:5… см.: доступные методы Woocommerce apidocs class WC_Shipping_Rate - person LoicTheAztec; 24.04.2020
comment
Я тестирую с идентификаторами flat_rate. Замена этой строки не сработала. :( - person Voltaki; 24.04.2020
comment
@Voltaki Что-то еще не работает в вашем случае, так как я уже много раз тестировал это в разных ответах, и он работает ... - person LoicTheAztec; 24.04.2020
comment
Мне жаль. Он действительно работал с flat_rate, но не раньше, чем обновлял и многократно менял параметры способа доставки и элементы корзины. Но, хотя он работал с flat_rate, я не могу заставить его работать с моим индивидуальным методом доставки. У тебя есть какие-нибудь подсказки? - person Voltaki; 24.04.2020