WooCommerce-添加到订单的项目实际上并未保存?

时间:2018-12-06 作者:Zachary Craig

我正在尝试制作一个插件,将两个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,“订单项在保存之前不会持久存在。”,但我已经多次保存订单了。

我是不是漏了一步?

谢谢

2 个回复
最合适的回答,由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.

相关推荐