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中定义,其函数体如下:,这样,我们简单地在第746行前面加上//注释掉这个语句,就可以支持中文用户名了。当然,根据版本不同,你的不一定也是第746行。,//$username = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $username );,
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中定义,其函数体如下:
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 ); }
这样,我们简单地在第746行前面加上//注释掉这个语句,就可以支持中文用户名了。当然,根据版本不同,你的不一定也是第746行。
//$username = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $username );
,
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中定义,其函数体如下:
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 ); }
这样,我们简单地在第746行前面加上//注释掉这个语句,就可以支持中文用户名了。当然,根据版本不同,你的不一定也是第746行。
//$username = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $username );
此处评论已关闭