You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

原代码失效的原因解析

  1. 元数据来源错误:你用get_post_meta($product_id)读取的是产品本身的元数据,而订单商品的专属元数据(如当时的批发价)存储在woocommerce_order_itemmeta表,而非postmeta表,必须从订单项对象获取。
  2. 参数格式错误:add_product的$args参数中,自定义元数据必须放在meta_data子数组中,每个元素是包含key和value的数组,直接平级传递键值对不被识别。
  3. 未执行保存操作:新增订单项或修改订单后,必须调用save()方法才能将数据写入数据库,原代码缺少这一步,导致元数据无法持久化。

内容的提问来源于stack exchange,提问作者iv444

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:52:41