I'm using Wordpress 4.9.6 and WooCommerce 3.4.2 on a Woocommerce site and where I have a custom feature that creates invoices for event registrations.
Right now I'm working on a script that will just remove one item from an existing order. The items remove fine, but the total doesn't recalculate. I can view the order in wp-admin and recalculate the totals from there fine, but I need it to happen in this script.
I can't for the life of me figure out what's keeping this from working...
My actual code:
$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;
}
Any help on this is appreciated.
If it's like wc_delete_order_item()
function is running asynchronously and not completing before calculate_totals()
method, you could try to use WC_Data
delete()
method instead.
As your code is not really testable, I am just wondering. So you could try something like:
$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;
}
It could works…