A-A+

WordPress 注册支持中文

2014年03月20日 编程技术 暂无评论

WordPress的用户名一共有三种,我们打开users表就可以看到这三种分别是user_login、user_nicename、 display_name,第一个user_login指的是登录名,第三个display_name指的是显示在前台文章、评论里面的名字。

display_name是可以显示中文字符的,也是允许用户自行修改的,但是代表用户唯一身份的user_login确实并不支持中文用户名,注册后也不允许自行修改。

虽然很多情况下user_login不支持中文用户名也无伤大雅,可以有display_name在前台应付,不过有时候我们还是希望user_login也支持中文用户名。

分析WP的代码发 现,问题出在sanitize_user这个函数上。WP使用这个函数对用户名进行过滤,这个函数的第二个可选参数$strict默认是关闭 (flase)的,即不进行相关字符屏蔽。WP在用户名的注册和修改过程中在validate_username和wp_insert_user两个函数 中调用了sanitize_user,并且以ture为第二个参数的值,这样就屏蔽了数字和字母以外的字符(only alphanumeric characters)。

sanitize_user在wp_includes/formatting.php中定义,其函数体如下:

[code lang="php"]
function sanitize_user( $username, $strict = false ) {
$raw_username = $username;
$username = wp_strip_all_tags( $username );
$username = remove_accents( $username );
// Kill octets
$username = preg_replace( '|%([a-fA-F0-9][a-fA-F0
-9])|', '', $username );
$username = preg_replace( '/&.+?;/', '', $usernam
e ); // Kill entities

// If strict, reduce to ASCII for max portability.
if ( $strict )
$username = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $username );

// Consolidate contiguous whitespace
$username = preg_replace( '|\s+|', ' ', $username );

return apply_filters( 'sanitize_user', $username, $r
aw_username, $strict );
}
[/code]

这样,我们简单地在第746行前面加上//注释掉这个语句,就可以支持中文用户名了。当然,根据版本不同,你的不一定也是第746行。

//$username = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $username );

标签:

给我留言