在希伯来语中注册wordpress中的用户名

时间:2014-04-18 22:00:18

标签: php database wordpress

我希望我网站的访问者能够使用希伯来语用户名注册。

在我的网站上,当我尝试使用希伯来语字符用户名注册时,它没有给我任何错误, 用户收到一封电子邮件,说明他已成功注册,管理员会收到一封包含用户详细信息的电子邮件,

BUT

用户实际上没有注册到数据库...他没有在users表中显示,当他尝试登录时出现错误,说没有这样的用户......

英语用户名

不会发生这种情况

有什么方法可以解决这个问题吗?

2 个答案:

答案 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,以支持数据库中基于希伯来语的文本。

enter image description here

参考文献:

https://www.serverintellect.com/support/sqlserver/change-database-collation/

http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html

希望有所帮助!