为WordPress及WooCommerce姓名字段添加无数字验证(无需插件)
解决方案:为姓名字段添加数字禁用验证
1. 覆盖所有需验证的场景
要实现全场景验证,需针对以下场景绑定对应的钩子:
- WordPress后台用户创建/编辑:
user_profile_update_errors - WooCommerce账户资料保存:
woocommerce_save_account_details_errors - WordPress前端注册:
register_post - WooCommerce前端注册:
woocommerce_register_post
2. 完整验证代码
基于你提供的代码修改扩展,同时处理名(First name)和姓(Last name)字段,并适配不同场景的参数差异:
// WordPress后台用户编辑/创建验证 add_action( 'user_profile_update_errors', 'validate_name_fields', 10, 3 ); // WooCommerce账户资料保存验证 add_action( 'woocommerce_save_account_details_errors', 'validate_name_fields', 10, 1 ); // WordPress前端注册验证 add_action( 'register_post', 'validate_name_fields_frontend', 10, 3 ); // WooCommerce前端注册验证 add_action( 'woocommerce_register_post', 'validate_name_fields_woocommerce', 10, 3 ); /** * 验证姓名字段(后台及WooCommerce账户场景) */ function validate_name_fields( $errors ) { // 验证名字(First name) if ( isset( $_POST['first_name'] ) && preg_match( '~[0-9]+~', $_POST['first_name'] ) ) { $errors->add( 'first_name_error', __( '名字中不能包含数字', 'woocommerce' ) ); } // 验证姓氏(Last name) if ( isset( $_POST['last_name'] ) && preg_match( '~[0-9]+~', $_POST['last_name'] ) ) { $errors->add( 'last_name_error', __( '姓氏中不能包含数字', 'woocommerce' ) ); } } /** * WordPress前端注册表单的姓名验证 */ function validate_name_fields_frontend( $login, $email, $errors ) { // 验证名字 if ( isset( $_POST['first_name'] ) && preg_match( '~[0-9]+~', $_POST['first_name'] ) ) { $errors->add( 'first_name_error', __( '名字中不能包含数字', 'default' ) ); } // 验证姓氏 if ( isset( $_POST['last_name'] ) && preg_match( '~[0-9]+~', $_POST['last_name'] ) ) { $errors->add( 'last_name_error', __( '姓氏中不能包含数字', 'default' ) ); } } /** * WooCommerce前端注册表单的姓名验证 */ function validate_name_fields_woocommerce( $username, $email, $errors ) { // 验证名字(WooCommerce注册表单字段名为billing_first_name) if ( isset( $_POST['billing_first_name'] ) && preg_match( '~[0-9]+~', $_POST['billing_first_name'] ) ) { $errors->add( 'billing_first_name_error', __( '名字中不能包含数字', 'woocommerce' ) ); } // 验证姓氏(WooCommerce注册表单字段名为billing_last_name) if ( isset( $_POST['billing_last_name'] ) && preg_match( '~[0-9]+~', $_POST['billing_last_name'] ) ) { $errors->add( 'billing_last_name_error', __( '姓氏中不能包含数字', 'woocommerce' ) ); } }
代码说明
- 钩子适配:不同场景的钩子参数结构、字段名存在差异(比如WooCommerce前端注册用
billing_first_name而非first_name),因此拆分函数针对性处理。 - 验证逻辑:通过
preg_match检测字段值是否包含数字,若不符合规则则添加对应错误提示。 - 多语言兼容:错误提示使用翻译函数
__(),并对应不同场景的文本域,确保多语言环境下正常显示。
使用方式
将上述代码添加到主题的functions.php文件,或自定义插件的PHP文件中即可生效。
内容的提问来源于stack exchange,提问作者R. De Caluwe
相关产品推荐
相关产品推荐

