Pregunta:
Después de buscar un par de días y leer hilos de hace 2 años, tengo dificultades para encontrar una solución al problema de que los usuarios inicien sesión solo por correo electrónico.
Al principio, me encantó ver WP_Email_Login solo para descubrir que aún puede usar su nombre de usuario para iniciar sesión. No estoy seguro de cómo escribir esto como un complemento. Mi idea es anular la función register_new_user. No vi esto en la lista de funciones "conectables". ¿Puedo usar filtros / acción para lograr esto?
Me doy cuenta de que no está de moda editar los archivos principales, así que espero que exista una solución; sin embargo, si no existe, me arriesgaré. En la primera línea de la función "register_new_user" en wp-login.php puedo agregar:
$nickname_variable(??) = $user_login // set the nickname to the username
$user_login = $user_email; // set the user_login/username to the email address
Esto funciona bastante bien ya que WordPress no permite que las personas cambien su nombre de usuario. En la pantalla de registro (formulario), solicita el nombre de usuario y el correo electrónico; Me gustaría establecer el nombre de usuario en la variable de apodo (si alguien me puede decir cómo se llama la variable de apodo o dónde se establece durante el registro, se agradecería).
Salud,
Herrero
Respuesta:
Actualización: He creado un complemento para iniciar sesión, registrarme y recuperar la contraseña con el correo electrónico. https://wordpress.org/plugins/smart-wp-login/
Respuesta en resumen, puede configurar WordPress para iniciar sesión con correo electrónico.
Tres pasos:
- Eliminar la función de autenticación predeterminada
- Agregar función de autenticación personalizada
- Cambie el texto "Nombre de usuario" en wp-login.php a "Correo electrónico"
Una nota:
- No edite los archivos principales.
Elimina la función de autenticación predeterminada de WordPress.
WordPress utiliza un filtro de " autenticación " para realizar una validación adicional en el inicio de sesión del usuario.
remove_filter('authenticate', 'wp_authenticate_username_password', 20);
Agregar función de autenticación personalizada
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);
Cambie el texto "Nombre de usuario" en wp-login.php a "Correo electrónico"
Podemos usar el filtro gettext para cambiar el texto "Nombre de usuario" a "Correo electrónico" sin editar los archivos principales.
add_filter('gettext', function($text){
if(in_array($GLOBALS['pagenow'], array('wp-login.php'))){
if('Username' == $text){
return 'Email';
}
}
return $text;
}, 20);
También he escrito un artículo detallado en mi blog http://www.thebinary.in/blog/wordpress-login-using-email/