Ultimate Member自定义用户名验证功能失效求助
解决Ultimate Member自定义用户名验证失效问题
针对你在WordPress 6.3.1 + Ultimate Member 2.6.11环境下,自定义用户名验证代码不生效的问题,以下是具体排查和修复方案:
问题分析
原代码存在两个核心问题:
- PHP版本兼容性:
str_contains是PHP 8.0+专属函数,若服务器PHP版本低于8.0,代码会静默执行失败。 - 钩子优先级:原代码优先级设为8,可能晚于Ultimate Member内部的验证逻辑,导致自定义错误被覆盖。
修复后的代码
方案一:兼容低版本PHP(推荐)
将str_contains替换为兼容PHP 7.4+的strpos,并提高钩子优先级确保优先执行:
add_action( 'um_submit_form_errors_hook', function( $args ) { if ( isset( $args['mode'] ) && 'register' === $args['mode'] ) { // 先确认用户名字段存在 if ( isset( $args['user_login'] ) ) { // 用strpos替代str_contains,兼容PHP<8.0 if ( strpos( $args['user_login'], '1234' ) === false ) { UM()->form()->add_error( 'user_login', __( 'Username must contain the string "1234".', 'ultimate-member' ) ); } } } }, 1, 1 ); // 提高优先级到1,确保在UM默认验证前执行
方案二:使用UM专属验证钩子
改用Ultimate Member提供的um_custom_field_validation钩子,专门处理字段自定义验证:
add_action( 'um_custom_field_validation', function( $key, $array, $args ) { if ( 'user_login' === $key && 'register' === $args['mode'] ) { $username = $array['user_login']; if ( strpos( $username, '1234' ) === false ) { UM()->form()->add_error( 'user_login', __( 'Username must contain the string "1234".', 'ultimate-member' ) ); } } }, 10, 3 );
额外排查步骤
- 确认代码添加到主题的functions.php文件或自定义插件中,不要直接修改Ultimate Member的核心文件。
- 检查服务器PHP版本,WordPress 6.3.1要求最低PHP 7.4,若低于8.0必须使用
strpos。 - 清除网站缓存(包括插件缓存、CDN缓存),避免旧代码残留。
内容的提问来源于stack exchange,提问作者liz14
相关产品推荐
相关产品推荐

