You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce旅客必填信息功能故障求助:验证失效+信息不显示

WooCommerce旅游票务订单乘客信息问题排查方案

一、必填字段为空仍可提交订单的排查与修复

  • 确认验证钩子使用正确
    必须依赖woocommerce_checkout_process钩子做后端验证,这是WooCommerce拦截无效订单提交的核心钩子。示例代码:
    add_action('woocommerce_checkout_process', 'validate_passenger_required_fields');
    function validate_passenger_required_fields() {
        // 示例:验证第1位乘客姓名字段
        if (empty($_POST['passenger_name_1'])) {
            wc_add_notice(__('请填写第1位乘客的姓名', 'your-text-domain'), 'error');
        }
        // 其他必填字段重复上述逻辑
    }
    
  • 核对字段name属性与验证逻辑的一致性
    渲染字段时的name属性(如passenger_name_1)必须和$_POST中获取的键完全匹配,避免拼写错误导致验证失效。
  • 不要仅依赖前端验证
    HTML的required属性可被浏览器调试绕过,后端验证是必填字段生效的唯一保障。

二、乘客信息未在Thankyou页、邮件、后台显示的排查与修复

1. 先确认数据是否正确保存

进入WordPress后台对应订单页面,在右上角「屏幕选项」勾选「自定义字段」,检查是否存在你定义的乘客信息元数据(如_passenger_info):

  • 若不存在,检查保存钩子是否正确使用woocommerce_checkout_update_order_meta:
    add_action('woocommerce_checkout_update_order_meta', 'save_passenger_info_to_order');
    function save_passenger_info_to_order($order_id) {
        $passenger_data = [];
        if (!empty($_POST['passenger_name_1'])) {
            $passenger_data['name_1'] = sanitize_text_field($_POST['passenger_name_1']);
        }
        // 收集其他乘客字段
        if (!empty($passenger_data)) {
            update_post_meta($order_id, '_passenger_info', $passenger_data);
        }
    }
    
  • 确认update_post_meta的键名(如_passenger_info)无拼写错误,后续获取数据时需与该键名一致。

2. Thankyou页面显示修复

使用woocommerce_thankyou钩子渲染数据:

add_action('woocommerce_thankyou', 'display_passenger_info_on_thankyou');
function display_passenger_info_on_thankyou($order_id) {
    $passenger_info = get_post_meta($order_id, '_passenger_info', true);
    if (!empty($passenger_info)) {
        echo '<h3>乘客信息</h3>';
        echo '<ul>';
        foreach ($passenger_info as $key => $value) {
            echo '<li>' . ucfirst(str_replace('_', ' ', $key)) . ': ' . esc_html($value) . '</li>';
        }
        echo '</ul>';
    }
}

若显示被覆盖,可调整钩子优先级(如add_action(..., 20))。

3. 邮件显示修复

使用woocommerce_email_after_order_table钩子在邮件中插入信息:

add_action('woocommerce_email_after_order_table', 'display_passenger_info_in_email', 20, 4);
function display_passenger_info_in_email($order, $sent_to_admin, $plain_text, $email) {
    $passenger_info = get_post_meta($order->get_id(), '_passenger_info', true);
    if (!empty($passenger_info)) {
        if ($plain_text) {
            echo "\n乘客信息:\n";
            foreach ($passenger_info as $key => $value) {
                echo ucfirst(str_replace('_', ' ', $key)) . ': ' . $value . "\n";
            }
        } else {
            echo '<h3>乘客信息</h3>';
            echo '<ul>';
            foreach ($passenger_info as $key => $value) {
                echo '<li>' . ucfirst(str_replace('_', ' ', $key)) . ': ' . esc_html($value) . '</li>';
            }
            echo '</ul>';
        }
    }
}

4. 后台订单编辑页显示修复

使用woocommerce_admin_order_data_after_billing_address钩子在后台订单详情区展示:

add_action('woocommerce_admin_order_data_after_billing_address', 'display_passenger_info_in_admin_order', 10, 1);
function display_passenger_info_in_admin_order($order) {
    $passenger_info = get_post_meta($order->get_id(), '_passenger_info', true);
    if (!empty($passenger_info)) {
        echo '<div class="address">';
        echo '<h3>乘客信息</h3>';
        echo '<p>';
        foreach ($passenger_info as $key => $value) {
            echo '<strong>' . ucfirst(str_replace('_', ' ', $key)) . ':</strong> ' . esc_html($value) . '<br>';
        }
        echo '</p>';
        echo '</div>';
    }
}

内容的提问来源于stack exchange,提问作者Nick54530

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:13:14