经过几天的搜索并阅读了2年的旧线程后,我很难找到解决办法,让用户仅通过电子邮件登录。

起初,我很高兴看到WP_Email_Login仅用于找出您仍然可以使用您的用户名登录。我不确定如何将其编写为插件。我的想法是重写register_new_user函数。我没有在“可插拔”功能列表中看到此信息。我可以使用过滤器/操作来做到这一点吗?

我意识到编辑核心文件并不时尚,因此我希望有一个解决方案,但是如果不存在,我会抓住机会。在wp-login.php的“ register_new_user”函​​数的第一行中,我可以添加:

$nickname_variable(??) = $user_login // set the nickname to the username
$user_login = $user_email; // set the user_login/username to the email address


由于WordPress不允许人们更改,因此效果很好他们的用户名。在注册屏幕(窗体)中,要求输入用户名和电子邮件;我想将Username设置为Nickname变量(如果有人可以告诉我昵称变量是什么,或者在注册过程中在昵称中设置的位置,我们将不胜感激。)

干杯,

史密斯

评论

您是否要完全放弃用户名?为什么“电子邮件登录”插件对您不起作用?

我真的很好奇您为什么要删除用户名,因为这些是WordPress中所有用户信息的基础。这有点像尝试取消Posts一样-花费大量精力而不花很多功夫,并保证将来的问题。

@ Ryan-我认为我无法摆脱用户名,因此我只是强迫用户名等于电子邮件地址。

@SickHippie-对于登录,我认为电子邮件比用户名更好,更独特。用户发布时,我宁愿使用用户名作为昵称。没错,“摆脱”变量“用户名”会很痛苦,这就是为什么我没有。我只是在注册时为用户选择用户名(用户名将是他们的电子邮件地址;昵称将是他们作为用户名输入的名称)。最终,所有变量都没有丢失。

@SickHippie-您是对的,因为Wordpress的默认设置是不允许用户更改其用户名,即使他们要更改其联系电子邮件地址,其用户名/电子邮件地址也将保持不变。我考虑过,从一开始,以我个人的经验,我发现人们很少“删除”电子邮件地址。他们可能会获得新的,但通常他们仍然会拥有旧的。如果不是在极少数情况下,我们将在数据库中手动更改它。非常感谢您的反馈和见解SickHippie!现在,我希望为我的帖子找到解决方案:)

#1 楼

更新:
我创建了一个用于登录,注册和通过电子邮件检索密码的插件。 https://wordpress.org/plugins/smart-wp-login/

简而言之,您可以配置WordPress以通过电子邮件登录。

三个步骤:


删除默认的身份验证功能
添加自定义身份验证功能
将wp-login.php中的文本“用户名”更改为“电子邮件”

注意:


请勿编辑核心文件。

WordPress使用“身份验证”过滤器在用户登录时执行其他验证。

remove_filter('authenticate', 'wp_authenticate_username_password', 20);


添加自定义身份验证功能

add_filter('authenticate', function($user, $email, $password){

    //Check for empty fields
    if(empty($email) || empty ($password)){        
        //create new error object and add errors to it.
        $error = new WP_Error();

        if(empty($email)){ //No email
            $error->add('empty_username', __('<strong>ERROR</strong>: Email field is empty.'));
        }
        else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //Invalid Email
            $error->add('invalid_username', __('<strong>ERROR</strong>: Email is invalid.'));
        }

        if(empty($password)){ //No password
            $error->add('empty_password', __('<strong>ERROR</strong>: Password field is empty.'));
        }

        return $error;
    }

    //Check if user exists in WordPress database
    $user = get_user_by('email', $email);

    //bad email
    if(!$user){
        $error = new WP_Error();
        $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
        return $error;
    }
    else{ //check password
        if(!wp_check_password($password, $user->user_pass, $user->ID)){ //bad password
            $error = new WP_Error();
            $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
            return $error;
        }else{
            return $user; //passed
        }
    }
}, 20, 3);


更改文本“用户名”在wp-login.php中将其更改为“电子邮件”

我们可以使用gettext过滤器将文本“用户名”更改为“电子邮件”,而无需编辑核心文件。

add_filter('gettext', function($text){
    if(in_array($GLOBALS['pagenow'], array('wp-login.php'))){
        if('Username' == $text){
            return 'Email';
        }
    }
    return $text;
}, 20);


我还在我的博客http://www.thebinary.in/blog/wordpress-login-using-email/
中写了一篇详细的文章

评论


不错的答案Nishant

–安德鲁·巴特尔(Andrew Bartel)
2014年6月12日下午16:21

有用!就我而言,我只是剥离电子邮件中的特殊字符并使其成为用户名。因此user@example.com成为user_example_com,并且可以正常工作。

– wpcoder
18年4月28日在20:01

#2 楼

有可能,您必须通过动作过滤器更改默认验证。
// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );

// add custom filter
add_filter( 'authenticate', 'fb_authenticate_username_password', 20, 3 );
function fb_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) )
        $user = get_user_by( 'email', $username );
    
    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;
    
    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
}

替代品是插件,也许是该插件。

评论


感谢您的答复,但是我不确定您是否阅读了我的帖子或者我不太清楚。我为后者道歉。在我的原始帖子中,我提到了WP_Email_Login插件;您的代码和链接来自的确切插件。这是我的原始帖子:“起初,我很高兴看到WP_Email_Login只是发现您仍然可以使用用户名登录。” <---看到问题,我仍然可以使用用户名,因此这就是该插件无法使用的原因。由于无法消除用户名,因此我考虑通过强制用户名等于电子邮件地址来覆盖注册功能。

–agentsmith666
2012年5月10日6:37



但是,我正在寻找一种无需编辑核心文件即可完成此操作的方法。如果不可能的话,那很好,但是我想知道两种方式。谢谢!

–agentsmith666
2012年5月10日6:41



这是一种无需编辑核心文件的方法。将代码复制到插件中,激活并准备就绪。

– Bueltge
13年4月1日在22:06

#3 楼

使用上面的代码:

// Change login credentials
// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// add custom filter
add_filter( 'authenticate', 'my_authenticate_username_password', 20, 3 );
function my_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) ) {
        //if the username doesn't contain a @ set username to blank string
        //causes authenticate to fail
        if(strpos($username, '@') == FALSE){
                $username = '';
            }
        $user = get_user_by( 'email', $username );
        }
    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
} 


我们要做的就是检查所提供的用户名至少像电子邮件一样,如果不破坏用户名。

评论


Wordpress具有方便的内置函数,而不是用户名中的原始字符串检查“ @”:Sanitize_email将返回有效的电子邮件地址格式或不返回任何内容:sanitize_email('email¬!“ @ business_com'); //返回没有

– indextwo
2014年7月7日10:16



#4 楼

它已经存在于WP-CORE中!

现在wordpress已经允许将EMAIL注册为用户名。但是如果您谈论的是已经注册的用户,请尝试列出的答案。

#5 楼

创建优雅的解决方案只需要对上面的代码进行少量修改。 authenticate挂钩的文档指出应返回WP_User对象或WP_Error对象。wp_authenticate_username_password函数的源代码通过一些非常简单的检查来运行;例如,我们可以复制完成这些检查的方式,并创建一个新的WP_Error对象来处理电子邮件地址。另外,我们甚至可以根据需要调整wp_authenticate_username_password代码并对其进行修改,尽管除非您真的想自定义功能,否则这似乎是不必要的。下面的代码应该可以解决问题:(尽管我自己还没有测试过...)

// Remove the default authentication function
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );

// Add the custom authentication function
add_filter( 'authenticate', 'custom_authenticate_username_password', 20, 3 );

function custom_authenticate_username_password( $user, $username, $password ) {

    // Get the WP_User object based on the email address
    if ( ! empty( $username ) ) {
        $user = get_user_by( 'email', $username );
    }

    // Return a customized WP_Error object if a WP_User object was not be returned (i.e. The email doesn't exist or a regular username was provided)
    if ( ! $user ) {
        return new WP_Error( 'invalid_username_email', sprintf( __( '<strong>ERROR</strong>: Invalid username. Please log in with your email address. <a href="%s" title="Password Lost and Found">Lost your password</a>?' ), wp_lostpassword_url() ) );
    }

    // Hand authentication back over to the default handler now that we a have a valid WP_User object based on the email address
    return wp_authenticate_username_password( null, $username, $password );
}


#6 楼

有一个用于此的插件:
强制电子邮件登录
https://br.wordpress.org/plugins/force-email-login/
它也在Github上:
https: //github.com/miya0001/force-email-login

评论


真好您可以将raw.githubusercontent.com/miya0001/force-email-login/master / ...放入mu-plugins

– squarecandy
20-2-14在23:01