Add update or remove WooCommerce shipping order items
To add or update shipping items use the following:
$order_id = 2343;$order = wc_get_order($order_id);$cost = 10;$items = (array) $order->get_items('shipping');$country = $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));if ( sizeof( $items ) == 0 ) { $item = new WC_Order_Item_Shipping(); $items = array($item); $new_item = true;}// Loop through shipping itemsforeach ( $items as $item ) { $item->set_method_title( __("Amazon shipping rate") ); $item->set_method_id( "amazon_flat_rate:17" ); // set an existing Shipping method rate ID $item->set_total( $cost ); // (optional) $item->calculate_taxes( $calculate_tax_for ); // Calculate taxes if( isset($new_item) && $new_item ) { $order->add_item( $item ); } else { $item->save() }}$order->calculate_totals();
It should better work…
To remove shipping items use te following:
$order_id = 2343;$order = wc_get_order($order_id);$items = (array) $order->get_items('shipping');if ( sizeof( $items ) > 0 ) { // Loop through shipping items foreach ( $items as $item_id => $item ) { $order->remove_item( $item_id ); } $order->calculate_totals();}
Related: Add a shipping to an order programmatically in Woocommerce 3
The WC_Order_Item_Shipping
object can be added to an order using either of 2 methods.
WC_ORDER->add_shipping( WC_Order_Item_Shipping )
This is deprecated in WooCommerce V3.WC_ORDER->add_item( WC_Order_Item_Shipping )
If you need to persist this change on the database then use WC_ORDER->save();
References: woocommerce.github.io.../#add_shipping woocommerce.github.io.../#add_item