如何在WooCommerce结账页新用户注册环节添加额外自定义字段
WooCommerce结账创建账号区新增字段解决方案
1. 调整字段显示位置到创建账号密码字段后
你之前使用woocommerce_checkout_fields过滤器默认将字段加入账单信息组,因此会出现在创建账号复选框前。要调整位置可以直接使用woocommerce_after_checkout_registration_form动作钩子,这个钩子的触发位置刚好在原生「创建账号密码」字段之后,搭配show_if_create_account类即可实现勾选创建账号时才显示的效果,和原生字段逻辑一致。
示例代码如下:
// 在创建账号密码字段后新增自定义字段 add_action( 'woocommerce_after_checkout_registration_form', 'add_custom_registration_fields_after_password' ); function add_custom_registration_fields_after_password() { // 密码确认字段 woocommerce_form_field( 'account_password_confirm', array( 'type' => 'password', 'label' => __('确认密码', 'woocommerce'), 'required' => true, 'class' => array('form-row form-row-wide', 'show_if_create_account'), 'placeholder' => __('再次输入密码', 'woocommerce'), ), wc_get_post_data_by_key( 'account_password_confirm' ) ); // 邮箱确认字段 woocommerce_form_field( 'billing_email_cnfrm', array( 'type' => 'text', 'label' => __('确认邮箱地址', 'woocommerce'), 'required' => true, 'class' => array('form-row form-row-wide', 'show_if_create_account'), 'placeholder' => __('再次输入邮箱地址', 'woocommerce'), ), wc_get_post_data_by_key( 'billing_email_cnfrm' ) ); // 发送邮件复选框 woocommerce_form_field( 'send_me_email_notice', array( 'type' => 'checkbox', 'label' => __('向我发送邮件', 'woocommerce'), 'required' => false, 'class' => array('form-row form-row-wide', 'show_if_create_account'), ), wc_get_post_data_by_key( 'send_me_email_notice' ) ); } // 新增字段提交验证 add_action( 'woocommerce_checkout_process', 'validate_custom_registration_fields' ); function validate_custom_registration_fields() { // 仅勾选创建账号时触发验证 if ( isset($_POST['createaccount']) && wc_string_to_bool($_POST['createaccount']) ) { // 验证密码一致性 if ( $_POST['account_password'] !== $_POST['account_password_confirm'] ) { wc_add_notice( __('两次输入的密码不一致,请重新输入', 'woocommerce'), 'error' ); } // 验证邮箱一致性 if ( $_POST['billing_email'] !== $_POST['billing_email_cnfrm'] ) { wc_add_notice( __('两次输入的邮箱地址不一致,请重新输入', 'woocommerce'), 'error' ); } } }
2. 存储新增字段数据
使用woocommerce_created_customer动作钩子即可,该钩子会在新用户创建成功后触发,可直接获取新用户ID将自定义字段存入用户元数据:
add_action( 'woocommerce_created_customer', 'save_custom_registration_fields_data', 10, 1 ); function save_custom_registration_fields_data( $customer_id ) { // 存储邮件订阅选项 if ( isset($_POST['send_me_email_notice']) ) { update_user_meta( $customer_id, 'send_me_email_notice', wc_string_to_bool($_POST['send_me_email_notice']) ); } // 密码确认、邮箱确认仅需做校验,通常无需持久化存储,如有需求可按上述格式自行添加存储逻辑 }
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

