【问题标题】:Add update or remove WooCommerce shipping order items添加更新或删除 WooCommerce 运输订单项目
【发布时间】: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()

问题是,我必须在每次亚马逊状态更改时更新订单,这样做没有问题,问题是如果更新了运费,我也必须更新。但我还没有找到这样做。谁能告诉我如何更新以这种方式设置的订单的运输项目?或者是这样的事实,一旦设置了运输项目,我们就无法更新或删除它? 任何形式的建议都受到高度赞赏。谢谢。

【问题讨论】:

    标签: php wordpress woocommerce shipping orders


    【解决方案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 对象可以使用两种方法之一添加到订单中。

    1. WC_ORDER->add_shipping( WC_Order_Item_Shipping ) 在 WooCommerce V3 中已弃用。
    2. WC_ORDER->add_item( WC_Order_Item_Shipping )

    如果您需要在数据库中保留此更改,请使用WC_ORDER->save();

    参考:woocommerce.github.io.../#add_shippingwoocommerce.github.io.../#add_item

    【讨论】:

      猜你喜欢
      • 2018-09-15
      • 2023-04-01
      • 1970-01-01
      • 2021-02-12
      • 2019-06-12
      • 2017-09-16
      • 2021-07-13
      • 2018-03-08
      • 2014-05-05
      相关资源
      最近更新 更多