删除Woocommerce 3中的订单商品后,未保存重新计算的总计

时间:2018-06-14 23:33:52

标签: php wordpress methods woocommerce orders

我在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;
}

对此有任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

在最新版本的WooCommerce中,如果要从订单中删除项目,则可以使用Order类中的remove_item()方法。例如:

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

谢谢

答案 1 :(得分:0)

如果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;
}

它可以运作......