如何在WooCommerce注册页面一次性展示全部表单校验错误提示
解决方法
更换钩子为woocommerce_process_registration_errors,同时保留传入的默认校验错误对象,不要直接创建新的错误对象,在原有对象的基础上追加你的自定义字段校验错误即可,既可以实现所有错误一次性展示,也不会丢失WooCommerce原生的校验提示。
具体修改步骤
- 删除原有的
add_action( 'woocommerce_register_post', 'wooc_validate_extra_register_fields', 10, 3 );钩子绑定 - 调整自定义校验函数的参数顺序,适配
woocommerce_process_registration_errors钩子的传参规则 - 所有自定义错误都追加到传入的错误对象中,最终返回该对象即可
修改后的完整代码
function wooc_validate_extra_register_fields( $validation_errors, $username, $email ) { // 原有自定义校验逻辑完全保留,无需修改 if ( isset( $_POST['billing_first_name'] ) && empty( $_POST['billing_first_name'] ) ) { $validation_errors->add( 'billing_first_name_error', __( 'First name cannot be left blank.', 'woocommerce' ) ); } if ( isset( $_POST['billing_last_name'] ) && empty( $_POST['billing_last_name'] ) ) { $validation_errors->add( 'billing_last_name_error', __( 'Last name cannot be left blank.', 'woocommerce' ) ); } if ( isset( $_POST['reg_customer_dob'] ) && empty( $_POST['reg_customer_dob'] ) ) { $validation_errors->add( 'reg_customer_dob_error', __( 'Date of birth cannot be left blank.', 'woocommerce' ) ); } if ( isset( $_POST['billing_email_cnfrm'] ) && empty( $_POST['billing_email_cnfrm'] ) ) { $validation_errors->add( 'confirm_email_error', __( 'Confirm email address cannot be left blank.', 'woocommerce' ) ); } /** 兼容我的账户页注册/结账页注册的逻辑冲突 */ if(isset($_POST['billing_email'])) { if($_POST['billing_email_cnfrm'] != $_POST['billing_email']) { error_log("结账页确认邮箱 - " . $_POST['billing_email_cnfrm'] ." 用户填写邮箱 - " . $_POST['billing_email']); $validation_errors->add( 'email_not_match_error', __( '结账页错误:确认邮箱地址不匹配', 'woocommerce' ) ); } } if( isset($_POST['email'])) { if ( $_POST['billing_email_cnfrm'] != $_POST['email'] ) { error_log("注册页确认邮箱 - " . $_POST['billing_email_cnfrm'] ." 用户填写邮箱 - " . $_POST['email']); $validation_errors->add( 'email_not_match_error', __( '注册页错误:确认邮箱地址不匹配', 'woocommerce' ) ); } } /** 兼容逻辑结束 */ if ( isset( $_POST['user_password_again'] ) && empty( $_POST['user_password_again'] ) ) { $validation_errors->add( 'confirm_password_error', __( '确认密码不能为空', 'woocommerce' ) ); } /** 兼容我的账户页注册/结账页注册的逻辑冲突 */ if(isset($_POST['account_password'] )) { if ( $_POST['user_password_again'] != $_POST['account_password'] ) { $validation_errors->add( 'password_not_match_error', __( '结账页错误:两次输入密码不匹配', 'woocommerce' ) ); } } if(isset($_POST['password'] )) { if ( $_POST['user_password_again'] != $_POST['password'] ) { $validation_errors->add( 'password_not_match_error', __( '注册页错误:两次输入密码不匹配', 'woocommerce' ) ); } } /** 兼容逻辑结束 */ if ( isset( $_POST['billing_phone'] ) && empty( $_POST['billing_phone'] ) ) { $validation_errors->add( 'billing_mobile_number_error', __( '手机号不能为空', 'woocommerce' ) ); } if(!validate_mobile($_POST['billing_phone'])) { $validation_errors->add( 'billing_mobile_number_error', __( '手机号只能为数字,不能包含空格', 'woocommerce' ) ); } /* if (isset($_POST['billing_phone']) && strlen($_POST['billing_phone']) < 5 ) { $validation_errors->add('billing_mobile_number_error', __('<strong>手机号长度不能少于5位</strong>', 'woocommerce')); } */ return $validation_errors; } // 绑定过滤器钩子,优先级10,接收3个参数 add_filter( 'woocommerce_process_registration_errors', 'wooc_validate_extra_register_fields', 10, 3 );
原理说明
woocommerce_process_registration_errors是过滤器钩子,WooCommerce会先把wc_create_new_customer()产生的所有原生校验错误传入这个钩子,再执行开发者绑定的自定义逻辑。你之前用这个钩子丢失默认提示的原因是在函数内新建了WP_Error对象返回,覆盖了原有传入的错误对象,现在直接在传入的错误对象上追加自定义错误,原生和自定义的错误都会被完整保留,前端会一次性全部展示。
内容的提问来源于stack exchange,提问作者Siddharth
相关产品推荐
相关产品推荐

