Woocommerce стоимость доставки на основе количества товара для указанного c класса доставки - PullRequest
2 голосов
/ 19 марта 2020

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

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

  • 2 из них используют shipping-class-1 (дополнительная стоимость доставки для продукта составляет $ 70)
  • 3 из них используют shipping-class-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;
    }
}

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

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

1 Ответ

2 голосов
/ 19 марта 2020

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

enter image description here

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;
    }
}

Должно работать с количеством товара в автомобиле, дополнительные расходы…

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

Другие темы ответов связанные с woocommerce_package_rates hook.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...