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

如何将WooCommerce已配置的自定义出生日期/城市字段添加到结账页

WooCommerce 结账页新增出生日期、出生城市必填字段实现方案

你可以在现有代码基础上追加以下三段代码即可实现需求:


1. 将字段渲染到结账页面

这里选择将字段放在账单信息之前展示,若用户已登录且之前填写过对应字段,会自动预填内容避免重复输入:

// 结账页插入自定义字段
function add_custom_fields_to_checkout( $checkout ) {
    $birthday = '';
    $birthcity = '';
    // 已登录用户优先读取已保存的用户资料
    if ( is_user_logged_in() ) {
        $user_id = get_current_user_id();
        $birthday = get_user_meta( $user_id, 'birthday_field', true );
        $birthcity = get_user_meta( $user_id, 'birthcity_field', true );
    }

    // 输出出生日期字段
    woocommerce_form_field( 'birthday_field', array(
        'type'        => 'date',
        'label'       => __( 'Data di nascita', 'woocommerce' ), // 可替换为中文“出生日期”
        'placeholder' => __( 'Data di nascita', 'woocommerce' ),
        'required'    => true,
        'class'       => array('form-row-wide'),
    ), $checkout->get_value( 'birthday_field' ) ? $checkout->get_value( 'birthday_field' ) : $birthday );

    // 输出生成城市字段
    woocommerce_form_field( 'birthcity_field', array(
        'type'        => 'text',
        'label'       => __( 'Città di nascita', 'woocommerce' ), // 可替换为中文“出生城市”
        'placeholder' => __( 'Città di nascita', 'woocommerce' ),
        'required'    => true,
        'class'       => array('form-row-wide'),
    ), $checkout->get_value( 'birthcity_field' ) ? $checkout->get_value( 'birthcity_field' ) : $birthcity );
}
add_action( 'woocommerce_before_checkout_billing_form', 'add_custom_fields_to_checkout' );

2. 提交订单时校验字段必填

用户提交订单时如果两个字段为空,会直接抛出错误提示阻止提交:

// 校验结账自定义字段
function validate_checkout_custom_fields() {
    if ( empty( $_POST['birthday_field'] ) ) {
        wc_add_notice( __( 'Prego inserire data di nascita', 'woocommerce' ), 'error' ); // 可替换为中文“请填写出生日期”
    }
    if ( empty( $_POST['birthcity_field'] ) ) {
        wc_add_notice( __( 'Prego inserire città di nascita', 'woocommerce' ), 'error' ); // 可替换为中文“请填写出生城市”
    }
}
add_action( 'woocommerce_checkout_process', 'validate_checkout_custom_fields' );

3. 订单创建后保存字段信息

字段会同时保存到订单元数据和用户元数据中,后续用户再次下单无需重复填写:

// 保存结账字段信息
function save_checkout_custom_fields( $order_id ) {
    $order = wc_get_order( $order_id );
    $user_id = $order->get_user_id();
    if ( $user_id && isset( $_POST['birthday_field'] ) ) {
        update_post_meta( $order_id, 'birthday_field', sanitize_text_field( $_POST['birthday_field'] ) );
        update_user_meta( $user_id, 'birthday_field', sanitize_text_field( $_POST['birthday_field'] ) );
    }
    if ( $user_id && isset( $_POST['birthcity_field'] ) ) {
        update_post_meta( $order_id, 'birthcity_field', sanitize_text_field( $_POST['birthcity_field'] ) );
        update_user_meta( $user_id, 'birthcity_field', sanitize_text_field( $_POST['birthcity_field'] ) );
    }
}
add_action( 'woocommerce_checkout_update_order_meta', 'save_checkout_custom_fields' );

小提示:你原有后台字段注册代码存在冗余,add_user_birtday_field函数已经同时输出了两个字段,后续重复挂载的add_user_birthcity_field、save_user_birthcity_field相关钩子可以直接删除,避免触发未定义函数报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:00:00