我在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;
}
对此的任何帮助不胜感激。
在最新版本的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();
谢谢
如果wc_delete_order_item()
函数异步运行并且未在方法之前完成calculate_totals()
则可以尝试改用WC_Data
delete()
方法。
由于您的代码不是真正可测试的,我只是想知道。所以你可以尝试这样的事情:
$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;
}
它可以工作...