Register email as username

时间:2018-02-24 作者:Gonzalo

我在Wordpress多站点中使用Wordpress 4.9.4,我需要允许用户使用其电子邮件地址作为用户名进行注册。查看代码,我发现阻止我完成的是ms函数。php有一个正则表达式过滤除a-z以外的其他字符的用户名,因此当电子邮件是用户名时,我会得到“用户名只能包含小写字母(a-z)和数字。”我在ms函数中更改了该正则表达式。php,它工作得很好。现在我的问题是,我不想每次更新wordpress时都重新编码wpmu\\u validate\\u user\\u signup函数。在这个问题上有什么好的做法?我是否应该创建另一个includes/ms函数。theme\\u子系统中的php?如果是这样,我可以只创建此函数,还是必须复制整个ms函数。php?

谢谢

4 个回复
SO网友:Mark Kaplun

电子邮件不能用作用户名,因为wordpress默认情况下将用户名用作URL的一部分(例如,作者页面)。因此,仅允许用户注册电子邮件地址是不够的,您还需要一些代码来处理URL相关的问题。

无论如何,这听起来像XY problem. 既然用户可以使用他们的电子邮件地址登录,为什么任何人都会关心他们在注册时创建的登录句柄是什么?最简单的方法是创建一个注册表,如果您不想让用户想到一个用户名,可以根据他的电子邮件为其创建一个“净化”用户名。

SO网友:Radley Sustaire

这是Gonzalo过滤器的一个更安全的版本,它只会删除“用户名只能包含小写字母(a-z)和数字”的验证错误。相反,它使用类似的验证,但允许在sanitize\\u email()中看到相同的字符。

唯一需要注意的是,这将检查错误消息名称。如果WordPress将来更改该错误消息,则将停止工作。但这是针对特定验证消息的唯一方法。

/**
 * Allow users to sign up using an email address as their username. 
 * Removes the default restriction of [a-z0-9] and replaces it with [a-z0-9+_.@-].
 *
 * @param $result
 *
 * @return array $result
 */
function wpse_295037_disable_username_character_type_restriction( $result ) {
    $errors = $result[\'errors\'];
    $user_name = $result[\'user_name\'];

    // The error message to look for. This should exactly match the error message from ms-functions.php -> wpmu_validate_user_signup().
    $error_message = __( \'Usernames can only contain lowercase letters (a-z) and numbers.\' );

    // Look through the errors for the above message.
    if ( !empty($errors->errors[\'user_name\']) ) foreach( $errors->errors[\'user_name\'] as $i => $message ) {

        // Check if it\'s the right error message.
        if ( $message === $error_message ) {

            // Remove the error message.
            unset($errors->errors[\'user_name\'][$i]);

            // Validate using different allowed characters based on sanitize_email().
            $pattern = "/[^a-z0-9+_.@-]/i";
            if ( preg_match( $pattern, $user_name ) ) {
                $errors->add( \'user_name\', __( \'Username is invalid. Usernames can only contain: lowercase letters, numbers, and these symbols: <code>+ _ . @ -</code>.\' ) );
            }

            // If there are no errors remaining, remove the error code
            if ( empty($errors->errors[\'user_name\']) ) {
                unset($errors->errors[\'user_name\']);
            }
        }
    }

    return $result;
}
add_filter( \'wpmu_validate_user_signup\', \'wpse_295037_disable_username_character_type_restriction\', 20 );

SO网友:Gonzalo

我在一个网站上找到了另一个解决方案。通过将此代码添加到注册插件类的顶部(在本例中为重力表单),可以覆盖验证并允许将电子邮件用作用户名:

function custom_register_with_email($result) {

   if ( $result[\'user_name\'] != \'\' && is_email( $result[\'user_name\'] ) ) {

      $result[\'errors\']->remove(\'user_name\');

   }

   return $result;
}
add_filter(\'wpmu_validate_user_signup\',\'custom_register_with_email\');

SO网友:Sokratesagogo

如果有人无意中发现了这一点,那就是(在撰写本文时)有10年历史的WP multisite;错误(&Q):https://core.trac.wordpress.org/ticket/17904

有人上传了一些类似Radley的MU插件代码:https://gist.github.com/anttiviljami/01611cf3e74f7e7ae7a6

结束

相关推荐

How to change a username?

如何更改用户名?我的用户名以作者身份出现在搜索引擎中,但它是一个基于产品和服务的网站(仅使用页面),供客户使用。如果我无法删除作者页面,我需要更改用户名。如果打开,您似乎可以更改用户名wordpress.com 所以这意味着它可能是可能的,但这是一个个人WP安装。