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

WooCommerce中将产品自定义元字段保存到订单项元数据的问题咨询

问题排查与修复方案

核心问题原因

你当前代码无法运行的核心问题为钩子选择错误:你使用的wc_add_order_item_meta钩子本身是执行wc_add_order_item_meta()函数时触发的动作,在回调函数中再次调用该函数会触发无限递归,直接导致代码执行中断,无法正常写入数据。

另外当前WooCommerce 3.0+版本已不推荐使用该钩子,建议使用更稳定的订单项创建钩子woocommerce_checkout_create_order_line_item实现需求。

修正后代码(适配WooCommerce 3.0+)

add_action( 'woocommerce_checkout_create_order_line_item', 'save_purchase_price_to_order_item', 10, 4 );

function save_purchase_price_to_order_item( $item, $cart_item_key, $values, $order ) {
    // 取当前产品ID,可变产品会自动取变体ID,避免取到父产品的错误价格
    $product_id = $values['data']->get_id();
    $purchase_price = get_post_meta( $product_id, '_wcj_purchase_price', true );
    // 非空校验避免写入无效值
    if ( ! empty( $purchase_price ) ) {
        $item->add_meta_data( '_purchase_price', $purchase_price, true );
    }
}

旧版本兼容方案(WooCommerce <3.0)

如果你仍在使用低于3.0的WooCommerce版本,可以使用以下代码:

add_action( 'woocommerce_add_order_item_meta', 'save_purchase_price_to_order_item_old', 10, 3 );

function save_purchase_price_to_order_item_old( $item_id, $values, $cart_item_key ) {
    // 可变产品可将product_id替换为variation_id取变体价格
    $product_id = $values['product_id'];
    $purchase_price = get_post_meta( $product_id, '_wcj_purchase_price', true );
    if ( ! empty( $purchase_price ) ) {
        wc_add_order_item_meta( $item_id, '_purchase_price', $purchase_price, false );
    }
}

校验方式

代码部署后,你可以通过模拟下单后查看后台订单项自定义字段,或直接查询数据库woocommerce_order_itemmeta表对应订单项ID下是否存在_purchase_price字段值,验证功能是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:57:02