¿Cómo iniciar sesión con el correo electrónico solo sin nombre de usuario?

16

Después de buscar un par de días y leer hilos de 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, estaba encantado de ver WP_Email_Login solo para descubrir que todavía puedes usar tu 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 haya una solución, pero si no existe, 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 & Email; 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 estableció durante el registro, eso se agradecería).

Saludos,

Smith

    
pregunta agentsmith666 09.05.2012 - 22:44

6 respuestas

15

Actualización: He creado un complemento para iniciar sesión, registrarme y recuperar la contraseña con el correo electrónico. enlace

En pocas palabras, puede configurar WordPress para iniciar sesión con el 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.

Eliminar la función de autenticación predeterminada de WordPress.

WordPress utiliza el filtro " authenticate " 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 enlace

    
respondido por el Nishant Kumar 12.06.2014 - 15:59
5

Es posible, debes cambiar el filtro para el nombre.

// 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 );
}

Una alternativa es un complemento, que encontrará a través de Google oder en el repositorio de complementos; tal vez este complemento .

    
respondido por el bueltge 10.05.2012 - 07:48
4

Utilizando el código anterior:

// 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 );
} 

Todo lo que teníamos que hacer era verificar que el nombre de usuario proporcionado al menos parecía un correo electrónico y, si no, sabotear el nombre de usuario.

    
respondido por el Vigs 01.06.2013 - 02:34
3

ya está en WP-CORE !

ahora wordpress ya permite registrar EMAIL como nombre de usuario. pero si está hablando de usuarios ya registrados, pruebe las respuestas enumeradas.

    
respondido por el T.Todua 17.07.2016 - 21:46
0

Todo lo que se necesita para crear una solución elegante es hacer pequeñas modificaciones en el código anterior. La documentación de para el enlace de autenticación indica que se debe devolver un objeto WP_User o un objeto WP_Error .

El código fuente para la función wp_authenticate_username_password se ejecuta a través de algunas comprobaciones bastante simples; solo podemos replicar la forma en que se realizan esas comprobaciones y crear un nuevo objeto WP_Error para gestionar la dirección de correo electrónico. Alternativamente, podríamos incluso robar el código wp_authenticate_username_password y modificarlo si quisiéramos, aunque parece innecesario a menos que realmente desee personalizar cómo funcionan las cosas. El código a continuación debería hacer el truco: (Aunque no lo he probado yo mismo ...)

// 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 );
}
    
respondido por el Andrew Odri 19.02.2014 - 20:31
0

Hay un complemento para eso:

Inicio de sesión de correo electrónico forzado

enlace

También está en Github: enlace

    
respondido por el Lucas Bustamante 17.04.2018 - 16:29

Lea otras preguntas en las etiquetas