添加更新或删除 WooCommerce 运输订单项目
Posted
技术标签:
【中文标题】添加更新或删除 WooCommerce 运输订单项目【英文标题】:Add update or remove WooCommerce shipping order items 【发布时间】:2019-09-26 01:21:51 【问题描述】:我已经为从亚马逊同步的订单添加了运费。出于某种原因,我不得不在为亚马逊订单创建的 woo 订单中设置自定义运费统一价格。如下:
$OrderOBJ = wc_get_order(2343);
$item = new WC_Order_Item_Shipping();
$new_ship_price = 10;
$shippingItem = $OrderOBJ->get_items('shipping');
$item->set_method_title( "Amazon shipping rate" );
$item->set_method_id( "amazon_flat_rate:17" );
$item->set_total( $new_ship_price );
$OrderOBJ->update_item( $item );
$OrderOBJ->calculate_totals();
$OrderOBJ->save()
问题是,我必须在每次亚马逊状态更改时更新订单,这样做没有问题,问题是如果更新了运费,我也必须更新。但我还没有找到这样做。谁能告诉我如何更新以这种方式设置的订单的运输项目?或者是这样的事实,一旦设置了运输项目,我们就无法更新或删除它? 任何形式的建议都受到高度赞赏。谢谢。
【问题讨论】:
【参考方案1】:要添加或更新运输项目,请使用以下命令:
$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 items
foreach ( $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();
它应该更好地工作......
要删除运输项目,请使用以下内容:
$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();
相关:Add a shipping to an order programmatically in Woocommerce 3
【讨论】:
感谢您的回答。我做了一些解决方法并实施了它。不过有一个问题,为了更新,我需要删除和添加对吗?在这种情况下没有这样的更新吧? @SuzAannshrestha 不一定……例如,如果删除/创建有效,请保持这种方式。稍后我将进行一些测试,以了解如何以最佳方式管理仅更新。 在实现时出现了一个简单的问题。以这种方式添加运费时,如果允许增值税,它会自动添加增值税金额并增加总运费。有什么办法可以在运输中排除增值税?谢谢。 @SuzAannshrestha 所以在这种情况下不要使用$item->calculate_taxes()
,所以删除它。而是添加这两行:$item->set_taxes(['total' => []]);
和 $item-> set_total_tax(0);
,这将使运输物品的税金为零。
当我添加这两行时,一个错误弹出窗口说,不能使用受保护的函数,因为'set_total_tax'是受保护的。在看到 set_taxes() 函数时,我看到它使用了 set_total_tax,所以我尝试像这样发送 0 值 $shipping->set_taxes(['total' => [0]]);但它没有设置增值税 0。它仍然是 20 %【参考方案2】:
WC_Order_Item_Shipping
对象可以使用两种方法之一添加到订单中。
WC_ORDER->add_shipping( WC_Order_Item_Shipping )
在 WooCommerce V3 中已弃用。
WC_ORDER->add_item( WC_Order_Item_Shipping )
如果您需要在数据库中保留此更改,请使用WC_ORDER->save();
参考:woocommerce.github.io.../#add_shippingwoocommerce.github.io.../#add_item
【讨论】:
以上是关于添加更新或删除 WooCommerce 运输订单项目的主要内容,如果未能解决你的问题,请参考以下文章
WooCommerce API:在订单项上创建包含元数据的订单