如何将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
相关产品推荐
相关产品推荐

