在 Woocommerce 3 中删除订单项后重新计算的总计未保存

Recalculated totals not saved after removing order items in Woocommerce 3

我在 Woocommerce 网站上使用 Wordpress 4.9.6 和 WooCommerce 3.4.2,我有一个自定义功能可以为活动注册创建发票。

现在我正在编写一个脚本,它只会从现有订单中删除一个项目。这些项目可以很好地删除,但总数不会重新计算。我可以在 wp-admin 中查看订单并从那里重新计算总数,但我需要它在这个脚本中发生。

我这辈子都想不通是什么导致它无法正常工作...

我的实际代码:

$order = wc_get_order($event_registration['OrderID']);

if ( count($order->get_items()) > 1 ) {
  if ( !wc_delete_order_item($event_registration['OrderItemID']) ) {
    return array('error' => 'Problem removing order item');
  }

  $updated_order = wc_get_order($event_registration['OrderID']);

  if ( count($updated_order->get_items()) > 0) {
    $updated_order->calculate_totals();
    PluginWoo::update_invoice($updated_order->get_id());

    return true;
  } else {
    if ( !wp_delete_post( $event_registration['OrderID'], true ) ) {
      return array('error' => 'Problem deleting order after deleting items');
    }
    return true;
  }
} else {
  if ( !wp_delete_post( $event_registration['OrderID'], true ) ) {
    return array('error' => 'Problem deleting order');
  }
  return true;
}

如有任何帮助,我们将不胜感激。

如果 wc_delete_order_item() 函数是 运行 异步的并且没有在 calculate_totals() 方法之前完成,您可以尝试使用 WC_Data delete() method 代替。

由于您的代码不是真正可测试的,我只是想知道。所以你可以尝试这样的事情:

$order = wc_get_order( $event_registration['OrderID'] );
$items = $order->get_items();
if ( count($items) > 1 ) {
    if( isset( $items[$event_registration['OrderItemID']] ) )
        $items[$event_registration['OrderItemID']]->delete(); // Deleting
    else
        return array('error' => 'Problem removing order item'); // Returning error
}

$updated_order = wc_get_order( $event_registration['OrderID'] );
$items = $updated_order->get_items();
if ( count($items) > 0 ) {
    $updated_order->calculate_totals();

    PluginWoo::update_invoice($updated_order->get_id());
    return true;
} else {
    if( isset( $items[$event_registration['OrderItemID']] ) )
        $items[$event_registration['OrderItemID']]->delete(); // Deleting
    else
        return array('error' => 'Problem deleting order after deleting items');

    return true;
}

它可以工作…

在最新版本的 WooCommerce 中,如果您想从订单中删除商品,可以使用订单 class 中的 remove_item() 方法。例如:

$order = wc_get_order( 1111 );
foreach( $order->get_items() as $item_id => $items ) {
 $order->remove_item( $item_id );
}
$order->calculate_totals();

谢谢