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

问题描述 投票:0回答:2

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

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

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

英语用户名不会发生这种情况

有没有什么办法解决这一问题?

php database wordpress
2个回答
1
投票

问题简述:(和可能的解决方案)

当wordpress创建用户的nicename(“一个包含用户的URL友好名称的字符串”)。

如果您指定了希伯来语用户名,则这将是一个html实体列表。在我的测试中,希伯来语用户名为“בדיקהקהקהק”,用户名为“%d7%91%d7%93%d7%99%d7%a7%d7%94%d7%a7%d7%94%d7%a7% d7%a7“(54个字符)。

wordpress数据库中字段user_nicename的长度为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或自定义库/函数的PHP Transliterator class使用拉丁字符。

我选择了最后一个解决方案,因为我使用共享主机而没有选项来安装其他库。

工作代码插入到我的模板的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 );  

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

希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.