我希望我网站的访问者能够使用希伯来语用户名注册。
在我的网站上,当我尝试使用希伯来语字符用户名注册时,它没有给我任何错误, 用户收到一封电子邮件,说明他已成功注册,管理员会收到一封包含用户详细信息的电子邮件,
BUT
用户实际上没有注册到数据库...他没有在users表中显示,当他尝试登录时出现错误,说没有这样的用户......
英语用户名
不会发生这种情况有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
问题的简短描述:(和可能的解决方案)
当wordpress创建用户的nicename(“一个包含用户的URL友好名称的字符串”)。
如果您指定了希伯来语用户名,则这将是一个html实体列表。 在我的测试中,希伯来语用户名为“בדיקהקהקהק”,用户名为“%d7%91%d7%93%d7%99%d7%a7%d7%94%d7%a7%d7%94%d7%a7% d7%a7“(54个字符)。
字段user_nicename的长度在wordpress数据库中是50个字符。 (顺便解释一下,为什么它最多可以使用8个字符的用户名)
看一下user.php的Wordpress代码,我们可以看到Wordpress在插入用户之前检查user_nicename
的长度,但它不起作用。
让我告诉你原因:
检查user_nicename
长度的代码是这样的:
$user_nicename = sanitize_user( $userdata['user_nicename'], true );
if ( mb_strlen( $user_nicename ) > 50 ) {
return new WP_Error( 'user_nicename_too_long', __( 'Nicename may not be longer than 50 characters.' ) );
}
当使用希伯来语用户名时,无论生成的user_nicename
的长度如何,条件将始终为真,因为函数sanitize_user()
“删除所有不安全的字符” - 包括html实体,并返回空字符串,长度= 0.
最后通过检查,您可能会觉得用户创建时没有错误,但这不是因为数据超出了user_nicename
中的字段长度。
可能的解决方案是以编程方式将字符串剪切为50个字符,强制某些stacig user_nicename
如“user-1”,“user-2”等,或者使用user_nicename
的拉丁字符{ {3}}或自定义库/函数。
我选择了最后一个解决方案,因为我使用了共享主机,没有选项来安装其他库。
工作代码 插入到我的模板的function.php中:
// user creation with Hebrew usernames
//function to transliterate username
function convert_user_nicename($hebrew_username) {
$charset = array('א'=>'a','ב'=>'b','ג'=>'g','ד'=>'d','ה'=>'h','ו'=>'v','ז'=>'z','ח'=>'h','ט'=>'t','י'=>'y','ך'=>'k','כ'=>'k','ל'=>'l','ם'=>'m','מ'=>'m','ן'=>'n','נ'=>'n','ס'=>'s','ע'=>'e','ף'=>'p','פ'=>'p','ץ'=>'ts','צ'=>'ts','ק'=>'q','ר'=>'r','ש'=>'sh','ת'=>'t');
$latin_user_slug = '';
$chars = mbStringToArray($hebrew_username);
foreach ($chars as $key =>$char) {
$latin_user_slug .= $charset[$char];
}
return($latin_user_slug);
}
function mbStringToArray ($string) {
$strlen = mb_strlen($string);
while ($strlen) {
$array[] = mb_substr($string,0,1,"UTF-8");
$string = mb_substr($string,1,$strlen,"UTF-8");
$strlen = mb_strlen($string);
}
return $array;
}
// remove the filter
remove_filter( 'pre_user_nicename', 'filter_pre_user_nicename', 10, 1 );
function filter_pre_user_nicename($user_nicename) {
$heb = html_entity_decode($user_nicename);
$user_nicename = convert_user_nicename($heb);
return $user_nicename;
};
// add new filter
add_filter( 'pre_user_nicename', 'filter_pre_user_nicename', 10, 1 );
答案 1 :(得分:0)
您需要更改MySQL Server连接排序规则。如果您有PhpMyAdmin,只需登录PhpMyAdmin即可更改。然后,在首页上,您将看到“服务器”连接排序规则(在“常规”选项卡上)。
将服务器连接排序规则更改为hebrew_general_ci,以支持数据库中基于希伯来语的文本。
参考文献:
https://www.serverintellect.com/support/sqlserver/change-database-collation/
http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html
希望有所帮助!