添加更新或删除 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:在订单项上创建包含元数据的订单

在 WooCommerce 中更改订单运费总额

禁用 Woocommerce 购物车订单项数量价格计算

在 Woocommerce 3+ 中使用订单项以编程方式创建订单

在 woocommerce 3 中获取订单项的元数据

如何从 Woocommerce 中的订单项中获取产品 sku [重复]