You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WooCommerce后台无法更新订单项自定义元字段‘Number of People’的问题求助

WooCommerce后台无法更新订单项自定义元字段‘Number of People’的问题求助

大家好,我现在遇到一个WooCommerce的问题,想请各位帮忙排查一下:

我需要在订单后台添加一个“Number of People”输入字段,用来更新指定订单项的自定义元数据。目前前端到结账的流程都正常,后台也能正确显示初始的人数值,但在后台修改输入框内容并保存订单后,订单项的对应元字段并没有被更新,实在找不到问题出在哪了。

先简单说下我的实现逻辑:

  1. 把前端提交的人数数据存入购物车项
  2. 结账时将购物车项的人数同步到订单项元数据
  3. 在后台订单页面的账单地址下方渲染可编辑的人数输入框
  4. 尝试在保存订单时更新订单项的对应元数据

以下是完整的代码实现:

/* 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键名一致

感觉自己肯定是漏了某个关键步骤或者函数调用有问题,但实在卡在这里了,想请各位帮忙看看哪里出错了?谢谢大家!

火山引擎 最新活动