用户名中的希伯来语字符有问题

时间:2016-05-22 作者:DrMosko

我编写了一个插件来启用用户名中的希伯来文字符。以下是完整代码:

add_filter (\'sanitize_user\', \'hu_sanitize_user\', 10, 3);

//Overrides the Wordpress sanitize_user filter to allow hebrew letters and english letters only

function hu_sanitize_user ($username, $raw_username, $strict)
{
//Strip HTML Tags
$username = wp_strip_all_tags ($raw_username);

//Remove Accents
$username = remove_accents ($username);

//Kill octets
$username = preg_replace (\'|%([a-fA-F0-9][a-fA-F0-9])|\', \'\', $username);


//Kill entities
$username = preg_replace (\'/&.+?;/\', \'\', $username);

if ($strict){
    //Replace
    $username = preg_replace( \'[\\p{Hebrew}a-zA-Z]\', \'\', $username );
}

//Remove Whitespaces
$username = trim ($username);

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

return $username;
}

它工作得很好,但问题是,如果用户名的长度超过8个字符,它不会在用户列表中创建用户。但是,它仍然会发送一封确认电子邮件,确认用户已创建,邮件中缺少名称和电子邮件地址。

知道我做错了什么吗?

1 个回复
SO网友:Tim Malone

This is not a complete answer, but it\'s an attempt at giving you some direction. Hopefully with the community here we can come up with a solution for you!

首先,我能够复制您的问题:

我把你的代码放在我的主题中functions.php 现在if( $strict ) 测试

  • 我尝试注册一个8个字符的希伯来名称-它起作用了
  • 我删除了你的函数并重试了-它失败了(这确认了你的函数起作用了)
  • 我添加了你的函数并尝试了一个9个字符的希伯来名称-它失败了
    1. (对于后面说非希伯来语的人,我只是使用了Google Translate 并将我自己的名字翻译成希伯来语,然后删除了字符)。

      当它不起作用时,我得到的错误是:

      ERROR: 无法注册您…请联系网站管理员!

      我以前从未见过这种错误。它来自wp-includes/user.php. 这告诉我们的是,按照这个顺序搜索,是wp_create_user(), 因此wp_insert_user(), 正在返回false或错误对象。

      wp_insert_user() 有很多我们可能插入的过滤器来帮助这项工作。它可能会绊倒其中一个。

      或者,这可能是数据库问题。This StackOverflow answer 有一些在MySQL数据库中支持希伯来文字符的想法。我的表编码已设置为utf8_general_ci 但我的数据库本身不是,所以我更改了它,不幸的是它没有解决它。我还试着运行SET NAMES 通过查询wpdb, 但有可能它不应该这样工作。

      我不是一个数据库专家,所以我不确定这是否是一个数据库限制,我们最终可能无法绕过。目前,我认为最好的机会在于wp_insert_user() 通过。

      我现在没有时间深入研究这些问题并找出问题所在,但希望这能给你一个良好的开端——如果可以的话,我会回来看看我还能找到什么。

  • 相关推荐

    如果已登录,我如何在主页上显示“Hello Username”

    我试图在一个小文本中显示当前登录用户的名称,如“你好,用户名!”。我尝试过这样做,但没有成功:<p class="vam"> <?php if(is_user_logged_in()): $current_user = wp_get_current_user(); ?> Hello, <b><?php echo $current_user->display_name; ?>&l