在网站运营中,限制用户注册某些特定的用户名是一项常见的安全和管理需求。这可以防止用户使用诸如“admin”、“administrator”等易混淆的管理员名称,或注册与网站核心页面(如“login”、“register”)同名的账户,从而避免潜在的混淆和安全风险。此外,屏蔽带有攻击性、侮辱性或垃圾广告性质的词汇,也有助于维护社区环境。
为 WordPress 网站添加用户名黑名单功能,能有效提升网站的安全性和管理的规范性。本文将提供一个经过优化和详细解释的代码解决方案。
核心功能代码
将以下代码添加到您当前主题的 functions.php 文件末尾,或通过“代码片段”类插件添加。
/**
* WordPress 用户名注册验证函数
* 功能:禁止注册黑名单中的用户名,并添加额外验证规则
*
* @param bool $valid 初始验证结果。
* @param string $username 用户尝试注册的用户名。
* @return bool 验证后的结果 (true 通过, false 拒绝)。
*/
function wp_custom_validate_username( $valid, $username ) {
// 1. 定义基础禁止注册的用户名数组
$forbidden_names = array(
'admin',
'administrator',
'webmaster',
'root',
'system',
'manager',
'moderator',
'support',
'contact',
'login',
'register',
'wp-admin',
'wp-login',
'yourdomain', // 请替换为您的实际域名
'test',
'demo'
);
// 2. 自动获取所有页面的别名(slug),并加入禁止列表
// 防止用户名与页面地址冲突
$all_pages = get_pages();
foreach ( $all_pages as $page ) {
if ( ! empty( $page->post_name ) ) {
$forbidden_names[] = $page->post_name;
}
}
// 3. 豁免条件:如果初始验证已失败,或当前用户是管理员且正在创建用户,则跳过本函数检查
if ( ! $valid || ( is_user_logged_in() && current_user_can( 'create_users' ) ) ) {
return $valid;
}
// 4. 开始自定义验证
$username_lowercase = strtolower( trim( $username ) );
// 规则1:用户名不能包含空格
if ( $valid && strpos( $username_lowercase, ' ' ) !== false ) {
$valid = false;
}
// 规则2:用户名不能在黑名单中
if ( $valid && in_array( $username_lowercase, $forbidden_names, true ) ) {
$valid = false;
}
// 规则3:用户名长度至少为 4 个字符(可根据需要调整)
if ( $valid && strlen( $username_lowercase ) < 4 ) {
$valid = false;
}
// 规则4:(示例)用户名不能仅为数字
// if ( $valid && is_numeric( $username_lowercase ) ) {
// $valid = false;
// }
return $valid;
}
add_filter( 'validate_username', 'wp_custom_validate_username', 10, 2 );
/**
* 自定义注册错误提示信息
* 当用户名被拒绝时,显示更友好的错误信息。
*
* @param WP_Error $errors WP_Error 对象。
* @return WP_Error 修改后的错误对象。
*/
function wp_custom_registration_errors( $errors ) {
// 检查是否存在“无效用户名”错误,并替换其提示信息
if ( isset( $errors->errors['invalid_username'] ) ) {
$errors->errors['invalid_username'][0] = __( '该用户名不符合要求或已被禁止注册,请尝试其他用户名。', 'your-text-domain' );
}
return $errors;
}
add_filter( 'registration_errors', 'wp_custom_registration_errors' );
代码详解与配置方法
1. 修改禁止注册的用户名列表
找到代码中的 $forbidden_names 数组。您可以自由地添加、删除或修改其中的字符串。例如,要禁止“editor”和“author”,只需将其加入数组:
$forbidden_names = array(
'admin',
'administrator',
'editor', // 新增
'author', // 新增
// ... 其他词
);
2. 理解自动获取页面别名的功能
代码中 get_pages() 部分会自动将您网站所有页面的别名(即URL中的部分,如关于我们页面“about-us”)加入禁止列表。这能有效防止用户注册与您重要页面同名的账户,避免URL冲突和混淆。
3. 自定义验证规则
代码中已包含几个核心验证规则:
- 禁止空格:确保用户名是一个连续的字符串。
- 黑名单检查:核心的禁止注册功能。
- 最小长度限制:默认要求用户名至少4个字符,您可以通过修改
strlen( $username_lowercase ) < 4中的数字来调整。
注释部分提供了一个“禁止纯数字用户名”的规则示例,如果您需要,只需移除其注释(//)即可生效。
4. 管理员豁免
代码通过 current_user_can( 'create_users' ) 判断,当具有“创建用户”权限的管理员在后台手动添加用户时,将跳过所有自定义验证规则。这确保了管理员在必要时可以注册任何用户名。
注意事项与兼容性
- 插件兼容性:此代码直接修改 WordPress 核心验证钩子,与绝大多数插件兼容。如果遇到冲突,请检查是否有其他插件(尤其是会员、注册类插件)也修改了
validate_username或registration_errors过滤器。 - 多语言支持:错误提示信息使用了
__( '文本', 'your-text-domain' )函数,便于翻译。请将your-text-domain替换为您主题的文本域,或直接使用引号内的中文。 - 性能考虑:自动获取所有页面别名的操作仅在用户注册时执行一次,对性能影响微乎其微。如果您的网站有成千上万个页面,可以考虑将此列表缓存。
通过实施以上方案,您可以轻松、有效地管理 WordPress 网站的用户名注册,提升网站的专业性和安全性。