我正在尝试制作一个插件,将两个Cart合并为一个Cart。
我正在做以下工作:
$old_order = wc_get_order($old_order_id);
duplicate_line_items($new_order, $old_order);
//re-fetch order to make sure changes aren\'t lost.
$new_order = $wc_get_order($new_order->get_id());
$new_order->calculate_totals();
$new_order->save_meta_data();
$new_order->save();
我的
duplicate_line_items()
函数如下所示:
function duplicate_line_items($source_order, $new_order){
foreach ($source_order->get_items() as $item){
$new_order->add_item($item);
}
$new_order->apply_changes();
$new_order->save();
}
当我运行此代码时,这些项目不会显示在“新”订单(目标订单)的管理视图中,也不会显示在数据库中。
我确实看到了WC_Order::add_item()
docs,“订单项在保存之前不会持久存在。”,但我已经多次保存订单了。
我是不是漏了一步?
谢谢
最合适的回答,由SO网友:Zachary Craig 整理而成
我已经解决了我的问题,我误解了wc_add_order_item()
\'sitem_array
参数,并假定该参数用于项目数据。
工作功能:
/**
*
* Copy all line items from
*
* @param $source_order \\WC_Order
* @param $destination_order \\WC_Order
*/
private function duplicate_line_items($source_order, $destination_order){
//get all item types.
foreach ($source_order->get_items([\'line_item\', \'shipping\', \'tax\']) as $item_id => $item){
$data = $item->get_data();
$data[\'order_id\'] = $destination_order->get_id();
$new_item_id = wc_add_order_item($destination_order->get_id(), [\'order_item_name\' => $item->get_name(), \'order_item_type\' => $item->get_type()]);
$meta = wc_get_order_item_meta($item_id);
foreach ($meta as $meta_key => $meta_value){
//needed incase there are multiple values for the same key: eg, ingredients.
foreach ($meta_value as $number => $raw_value){
wc_add_order_item_meta($new_item_id, $meta_key, $raw_value);
}
}
}
}
希望这对以后的其他人有所帮助:)
SO网友:Jacob Peattie
你有你的duplicate_line_items()
编写函数,以便第一个参数中的项,$source_order
添加到第二个参数,$new_order
, 但在第一个代码块中,您将传递旧的顺序作为第二个参数:
duplicate_line_items($new_order, $old_order);
所以所有来自
$new_order
正在添加到
$old_order
, 而不是相反。
确保始终使用变量:
duplicate_line_items( $old_order, $new_order );
也许在中命名变量
duplicate_line_items()
更清楚一点:
function duplicate_line_items( $source_order, $target_order ) {
foreach ( $source_order->get_items() as $item ) {
$target_order->add_item( $item );
}
$target_order->save();
}
因此,通过这两个更改,您可以正确设置
$old_order
作为
$source_order
和
$new_order
作为
$target_order
.