WooCommerce后台无法更新订单项自定义元字段‘Number of People’的问题求助
WooCommerce后台无法更新订单项自定义元字段‘Number of People’的问题求助
大家好,我现在遇到一个WooCommerce的问题,想请各位帮忙排查一下:
我需要在订单后台添加一个“Number of People”输入字段,用来更新指定订单项的自定义元数据。目前前端到结账的流程都正常,后台也能正确显示初始的人数值,但在后台修改输入框内容并保存订单后,订单项的对应元字段并没有被更新,实在找不到问题出在哪了。
先简单说下我的实现逻辑:
- 把前端提交的人数数据存入购物车项
- 结账时将购物车项的人数同步到订单项元数据
- 在后台订单页面的账单地址下方渲染可编辑的人数输入框
- 尝试在保存订单时更新订单项的对应元数据
以下是完整的代码实现:
/* Add custom field to cart item data */ add_filter('woocommerce_add_cart_item_data', function ($cart_item_data, $product_id, $variation_id) { if (isset($_POST['number_of_people'])) { $cart_item_data['number_of_people'] = (int) sanitize_text_field($_POST['number_of_people']); } return $cart_item_data; }, 10, 3); /* Add custom field to order line item */ add_action('woocommerce_checkout_create_order_line_item', function ($item, $cart_item_key, $values, $order) { if (isset($values['number_of_people'])) { $item->add_meta_data(__('Number of People', 'woocommerce'), $values['number_of_people']); } }, 10, 4); add_action('woocommerce_admin_order_data_after_billing_address', 'print_custom_fields_in_the_admin_order', 10, 1); function print_custom_fields_in_the_admin_order($order) { $order = wc_get_order($order->get_id()); foreach ($order->get_items() as $item_id => $item) { if (has_term('group-class', 'product_cat', $item->get_product_id())) { $number_of_people = $item->get_meta('Number of People', true); error_log('Number of People: ' . $number_of_people); break; } } ?> <div class="billing-custom-fields"> <h4>Additional Information</h4> <p><small>Click on the fields below to edit the values</small></p> <div class="order-custom-fields"> <label for="_number_of_people">Number of People:</label> <input type="number" id="_number_of_people" name="_number_of_people" value="<?php echo esc_attr($number_of_people); ?>" /> </div> </div> <?php } /** Save custom fields when order is updated in admin */ add_action('woocommerce_process_shop_order_meta', 'update_custom_fields_in_the_admin_order'); function update_custom_fields_in_the_admin_order($order_id) { if (! isset($_POST['_number_of_people'])) { return; } $meta_value = sanitize_text_field($_POST['_number_of_people']); $order = wc_get_order($order_id); foreach ($order->get_items() as $item_id => $item) { if (has_term('group-class', 'product_cat', $item->get_product_id())) { $item->update_meta_data('Number of People', $meta_value); $item->save(); break; } } $order->calculate_totals(); }
我已经尝试过这些排查步骤,但问题依然存在:
- 清理了网站缓存和PHP层面的缓存(包括手动删除缓存文件)
- 测试了多个包含“group-class”分类商品的订单
- 用
error_log验证了后台渲染时能正确读取初始人数值,且保存订单时update_custom_fields_in_the_admin_order函数确实被触发 - 确认输入框的
name属性和保存函数里的$_POST键名一致
感觉自己肯定是漏了某个关键步骤或者函数调用有问题,但实在卡在这里了,想请各位帮忙看看哪里出错了?谢谢大家!




