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
相关产品推荐
相关产品推荐

