使用woocommerce_new_order_item钩子保存订单项元数据失败求助
解决WooCommerce订单项元数据保存失败的问题
嘿,我来帮你搞定这个WooCommerce订单项元数据的问题!你的代码没生效主要有两个关键原因,咱们一步步梳理解决:
问题根源分析
钩子参数不匹配
woocommerce_new_order_item钩子的回调参数和你之前用的旧钩子完全不一样!它默认传递三个参数:$item_id(订单项ID)、$item(WC_Order_Item对象实例)、$order_id(订单ID)。你代码里写的$values根本不存在,这直接导致你拿不到想要的adults_qty数据。调用了废弃函数
wc_add_order_item_meta早就被WooCommerce标记为废弃函数了,现在官方推荐用WC_Order_Item对象的内置方法来管理元数据,这样更稳定也符合最新规范。
修正后的完整代码
假设你已经通过购物车环节收集到了adults_qty数据,下面是修正后的代码:
/** * 添加成人数量到订单项元数据 * @param int $item_id 订单项ID * @param WC_Order_Item $item 订单项对象 * @param int $order_id 订单ID * @return void */ function cart_add_meta_data_booking( $item_id, $item, $order_id ) { // 从订单项关联的购物车数据中获取成人数量 $cart_item_data = $item->get_meta('_cart_item_data'); $adults_qty = isset($cart_item_data['adults_qty']) ? $cart_item_data['adults_qty'] : ''; // 如果存在有效数据,添加到订单项元数据 if ( ! empty( $adults_qty ) ) { // add_meta_data方法:参数1=元数据键名,参数2=值,参数3=true表示在前台订单页显示 $item->add_meta_data( 'Adults', $adults_qty, true ); // 必须调用save()方法保存更改 $item->save(); } } // 注意第四个参数设为3,这样才能接收钩子传递的3个参数 add_action( 'woocommerce_new_order_item', 'cart_add_meta_data_booking', 10, 3 );
补充:如果还没在购物车保存数据
如果你还没在购物车阶段把adults_qty存起来,得先加这段代码确保数据能从购物车传递到订单项:
/** * 把成人数量保存到购物车项数据中 * @param array $cart_item_data 购物车项数据数组 * @param int $product_id 产品ID * @param int $variation_id 变体ID * @return array */ function save_adults_qty_to_cart( $cart_item_data, $product_id, $variation_id ) { // 假设你是通过表单POST获取成人数量,表单字段name为adults_qty if ( isset( $_POST['adults_qty'] ) ) { $cart_item_data['adults_qty'] = sanitize_text_field( $_POST['adults_qty'] ); // 添加唯一标识,避免同一产品多次添加时数据被覆盖 $cart_item_data['unique_key'] = md5( microtime() . rand() ); } return $cart_item_data; } add_filter( 'woocommerce_add_cart_item_data', 'save_adults_qty_to_cart', 10, 3 );
这样一套流程下来,就能顺利把成人数量从购物车传递并保存到订单项元数据里了。
内容的提问来源于stack exchange,提问作者Juan David
相关产品推荐
相关产品推荐

