Just change the $item_id to $to_order_item_id and you don’t even have to touch the order_item_meta since it is still associated with the proper $item_id. So your foreach from above would be …
foreach($order->get_items() as $item_id=>$item) {
wc_update_order_item($item_id, array('order_id'=>$to_order_item_id));
}
Then you could even calculate the new totals of both orders after by using …
$original_order = new WC_Order($original_order_id);
$original_order->calculate_totals();
$order = new WC_Order($to_order_item_id);
$order->calculate_totals();
I also discovered sometimes woocommerce will not let you change the order item data so I ended up doing the same as above but with a straight to the database update instead …
global $wpdb;
$table="wp_woocommerce_order_items";
$data = array('order_id'=>$to_order_item_id);
foreach($order->get_items() as $item_id=>$item) {
$where = array('order_item_id'=>$item_id);
$updated = $wpdb->update($table, $data, $where);
if($updated === false) {
echo 'sorry dawg, there was an error';
}
else {
echo 'you got the soup!';
}
}