在 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();
谢谢
我在 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();
谢谢