Программно добавить доставку к заказу в Woocommerce 3

Я пробовал множество решений, чтобы программно установить цену доставки (за заказ) через Woocommerce. Мне не повезло

Я попытался перезаписать мета-значение для элемента:

            update_post_meta( $woo_order_id, '_order_shipping', $new_ship_price );

Также пробовал что-то вроде этого [Вопрос / Ответ] [1]

                    $item_ship = new WC_Order_Item_Shipping();

                    $item_ship->set_name( "flat_rate" );
                    $item_ship->set_amount( $new_ship_price );
                    $item_ship->set_tax_class( '' );
                    $item_ship->set_tax_status( 'none' );


                    // Add Shipping item to the order
                    $order->add_item( $item_ship );

Но ни один из них не работает. Любые указатели приветствуются.


Аналогичная тема: Добавить плату на заказ программно в Woocommerce 3


person Callum    schedule 07.12.2018    source источник


Ответы (1)


Чтобы справиться с этим в Woocommerce 3+, используйте следующее (из объекта WC_Order Order $order):

## ------------- ADD SHIPPING PROCESS ---------------- ##

// Get the customer country code
$country_code = $order->get_shipping_country();

// Set the array for tax calculations
$calculate_tax_for = array(
    'country' => $country_code,
    'state' => '', // Can be set (optional)
    'postcode' => '', // Can be set (optional)
    'city' => '', // Can be set (optional)
);

// Optionally, set a total shipping amount
$new_ship_price = 5.10;

// Get a new instance of the WC_Order_Item_Shipping Object
$item = new WC_Order_Item_Shipping();

$item->set_method_title( "Flat rate" );
$item->set_method_id( "flat_rate:14" ); // set an existing Shipping method rate ID
$item->set_total( $new_ship_price ); // (optional)
$item->calculate_taxes($calculate_tax_for);

$order->add_item( $item );

$order->calculate_totals();

$order->update_status('on-hold');

// $order->save(); // If you don't update the order status

Проверено работает.

person LoicTheAztec    schedule 07.12.2018
comment
Красивый. Еще раз спасибо за вашу помощь, так ясно и кратко. - person Callum; 07.12.2018
comment
@LoicTheAztec Я искал этот код. Действительно великолепный мужчина! 100% сработало. - person Nidhishanker Modi; 16.07.2020
comment
Можно ли также заменить способ доставки? Я пробовал это, но теперь у меня есть 2 способа доставки для каждого заказа function myfunc($order_id){ $order = wc_get_order( $order_id ); $item = new WC_Order_Item_Shipping(); $item->set_method_title( "Ophalen" ); $item->set_method_id( "local_pickup:2" ); $order->remove_item('flat_rate:1'); $order->add_item( $item ); $order->save(); } add_action( 'woocommerce_checkout_order_processed', 'myfunc'); - person Jop; 11.03.2021
comment
@Jop Получите данные из метода доставки, который вы хотите изменить, чтобы вставить его как новый (с вашими изменениями), затем удалите старый, прежде чем вставлять новый. Так проще. - person LoicTheAztec; 11.03.2021
comment
Отлично, это то, что мне нужно для модульного тестирования. Когда вы говорите: $ item- ›set_method_id (flat_rate: 14); // установить существующий идентификатор тарифа метода доставки Как я могу добавить метод доставки? В моем модульном тесте мне не определен метод прокладки. - person StR; 12.05.2021