起初,我很高兴看到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变量(如果有人可以告诉我昵称变量是什么,或者在注册过程中在昵称中设置的位置,我们将不胜感激。)
干杯,
史密斯
#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
评论
您是否要完全放弃用户名?为什么“电子邮件登录”插件对您不起作用?我真的很好奇您为什么要删除用户名,因为这些是WordPress中所有用户信息的基础。这有点像尝试取消Posts一样-花费大量精力而不花很多功夫,并保证将来的问题。
@ Ryan-我认为我无法摆脱用户名,因此我只是强迫用户名等于电子邮件地址。
@SickHippie-对于登录,我认为电子邮件比用户名更好,更独特。用户发布时,我宁愿使用用户名作为昵称。没错,“摆脱”变量“用户名”会很痛苦,这就是为什么我没有。我只是在注册时为用户选择用户名(用户名将是他们的电子邮件地址;昵称将是他们作为用户名输入的名称)。最终,所有变量都没有丢失。
@SickHippie-您是对的,因为Wordpress的默认设置是不允许用户更改其用户名,即使他们要更改其联系电子邮件地址,其用户名/电子邮件地址也将保持不变。我考虑过,从一开始,以我个人的经验,我发现人们很少“删除”电子邮件地址。他们可能会获得新的,但通常他们仍然会拥有旧的。如果不是在极少数情况下,我们将在数据库中手动更改它。非常感谢您的反馈和见解SickHippie!现在,我希望为我的帖子找到解决方案:)