WooCommerce订单克隆时如何正确复制商品元数据?
WooCommerce订单克隆:订单项元数据未正确传递的解决方法
你的问题出在三个关键环节:
- 错误从产品的post元数据读取字段,订单商品的专属元数据是绑定在订单项上的(比如批发价这类字段多是下单时的临时数据,不属于产品本身的固定元数据)
add_product的参数格式错误,自定义元数据需要嵌套在meta_data键下传递- 没有保存新增的订单项与最终的订单
修正后的完整实现
直接克隆原订单项的元数据,使用正确参数格式并确保数据入库:
/** * 克隆订单及订单项元数据 */ $order = wc_get_order($post_id); $new_order = wc_get_order($new_post_id); foreach ($order->get_items() as $item) { // 获取原订单项的所有元数据 $item_meta = $item->get_meta_data(); // 构造添加产品的参数:元数据必须放在meta_data数组内 $args = [ 'meta_data' => $item_meta ]; // 向新订单添加产品,返回新增的订单项对象 $new_item = $new_order->add_product( wc_get_product($item->get_product_id()), $item->get_quantity(), $args ); // 单独保存订单项 if ($new_item) { $new_item->save(); } } // 最后保存整个新订单 $new_order->save();
仅克隆指定元数据字段的版本
如果不需要克隆所有元数据,只保留你指定的几个字段,可使用以下代码:
/** * 克隆订单指定的订单项元数据 */ $order = wc_get_order($post_id); $new_order = wc_get_order($new_post_id); // 指定需要克隆的元数据键名 $target_meta_keys = [ '_wwp_wholesale_priced', '_wwp_wholesale_role', '_amount_requested', '_amount_colli' ]; foreach ($order->get_items() as $item) { $meta_data = []; // 遍历目标键,从原订单项获取对应值 foreach ($target_meta_keys as $key) { $value = $item->get_meta($key, true); if ($value) { $meta_data[] = [ 'key' => $key, 'value' => $value ]; } } $args = [ 'meta_data' => $meta_data ]; $new_item = $new_order->add_product( wc_get_product($item->get_product_id()), $item->get_quantity(), $args ); if ($new_item) { $new_item->save(); } } $new_order->save();
原代码失效的原因解析
- 元数据来源错误:你用
get_post_meta($product_id)读取的是产品本身的元数据,而订单商品的专属元数据(如当时的批发价)存储在woocommerce_order_itemmeta表,而非postmeta表,必须从订单项对象获取。 - 参数格式错误:
add_product的$args参数中,自定义元数据必须放在meta_data子数组中,每个元素是包含key和value的数组,直接平级传递键值对不被识别。 - 未执行保存操作:新增订单项或修改订单后,必须调用
save()方法才能将数据写入数据库,原代码缺少这一步,导致元数据无法持久化。
内容的提问来源于stack exchange,提问作者iv444
相关产品推荐
相关产品推荐

