使用woocommerce_checkout_create_order_line_item钩子时无法获取订单项元数据的问题
嘿,我完全懂你遇到的困扰——在woocommerce_checkout_create_order_line_item钩子里用wc_get_order_item_meta拿不到同一订单项的元数据,问题的核心其实是这个钩子的执行时机:订单项此时还没被保存到数据库,$item_id根本还没生成,而wc_get_order_item_meta是依赖数据库记录来获取数据的,自然就失效了。
给你一个直接可行的解决方案:别用wc_get_order_item_meta,直接通过订单项对象本身来获取元数据就行,因为此时订单项已经在内存中创建完成,只是还没写入数据库而已。
具体代码示例
add_action('woocommerce_checkout_create_order_line_item', 'custom_update_and_retrieve_order_item_meta', 10, 4); function custom_update_and_retrieve_order_item_meta($item, $cart_item_key, $values, $order) { // 1. 先添加/更新订单项元数据 $item->update_meta_data('_custom_order_item_meta', '自定义的元数据内容'); // 2. 直接从订单项对象获取已存在的元数据,无需$item_id $target_meta_value = $item->get_meta('_existing_order_item_meta'); // 如果你需要的是购物车阶段的产品元数据,还可以直接用$values参数 $product_meta_from_cart = $values['data']->get_meta('_product_custom_meta'); // 手动保存元数据(钩子最终会自动处理,但手动保存能确保数据即时生效) $item->save(); }
关键说明
$item是WC_Order_Item_Product类的实例,它的get_meta()方法可以直接读取内存中的元数据,完全不需要依赖数据库里的item_id。- 如果你要获取的是购物车中产品自带的元数据,直接用
$values['data'](也就是产品对象)调用get_meta()会更直接,不用绕到订单项里。 - 为什么
wc_get_order_item_meta不行?因为这个函数需要的$item_id是订单项存入数据库后的自增ID,而woocommerce_checkout_create_order_line_item是在订单项准备创建但未写入数据库时触发的,此时$item->get_id()返回的是空值或0,自然无法通过该函数获取数据。
内容的提问来源于stack exchange,提问作者Luke Seall
相关产品推荐
相关产品推荐

