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

20

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, me encantó ver WP_Email_Login solo para descubrir que aún 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, sin embargo, si no existe una, 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 correo electrónico; Me gustaría establecer el Nombre de usuario en la variable Apodo (si alguien me puede decir cómo se llama la variable apodo o dónde se establece durante el registro, eso sería de agradecer).

Salud,

Herrero

agentesmith666
fuente
¿Estás tratando de eliminar por completo los nombres de usuario? ¿Por qué el complemento de inicio de sesión por correo electrónico no funciona para usted?
Ryan
Tengo mucha curiosidad por qué querría eliminar los nombres de usuario, ya que son la base de toda la información del usuario en WordPress. Es un poco como tratar de eliminar las publicaciones: mucho trabajo por poco dinero y una garantía de problemas en el futuro.
SickHippie
1
@ Ryan: no creo que pueda deshacerme de los nombres de usuario, por lo que solo estoy obligando al nombre de usuario a igualar la dirección de correo electrónico.
agentsmith666
@SickHippie: para iniciar sesión, creo que el correo electrónico es mejor y más exclusivo que un nombre de usuario. Prefiero usar el nombre de usuario como apodo cuando el usuario publica. Tienes razón, sería un dolor deshacerse de la variable "nombre de usuario", por lo que no lo soy. Solo elijo el nombre de usuario para el usuario cuando se registra (el nombre de usuario será su dirección de correo electrónico; su apodo será el que ingresó como nombre de usuario). Al final no se pierden variables, todo está intacto.
agentsmith666
1
@SickHippie: tiene razón, ya que el valor predeterminado de Wordpress no es permitir que el usuario cambie su nombre de usuario, su nombre de usuario / dirección de correo electrónico seguiría siendo el mismo incluso si cambiaran su dirección de correo electrónico de contacto. Lo he considerado desde el principio y, según mi propia experiencia, he descubierto que las personas rara vez "eliminan" una dirección de correo electrónico. Es posible que obtengan otros nuevos, pero generalmente seguirán teniendo los viejos. Y si no es así, en esas raras circunstancias, lo cambiaremos manualmente en la base de datos. ¡Realmente aprecio tus comentarios y opiniones de SickHippie! Ahora espero una solución para mi publicación :)
agentsmith666

Respuestas:

19

Actualización: he creado un complemento para iniciar sesión, registrarme y recuperar la contraseña con un correo electrónico. https://wordpress.org/plugins/smart-wp-login/

En resumen, 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 edites archivos principales.

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

WordPress utiliza el filtro " autenticar " 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 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/

Nishant Kumar
fuente
2
Buena respuesta Nishant
Andrew Bartel
¡útil! En mi caso, simplemente elimino caracteres especiales del correo electrónico y lo convierto en un nombre de usuario. entonces [email protected] se convierte en user_example_com y funcionó.
wpcoder
6

Es posible, debe 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 .

bueltge
fuente
Gracias por la respuesta, sin embargo, no estoy seguro de si leíste mi publicación o si no estaba lo suficientemente claro. Pido disculpas por lo último. En mi publicación original mencioné el complemento WP_Email_Login; el complemento exacto del que proviene su código y enlace. Aquí está mi publicación original: "Al principio estaba encantado de ver WP_Email_Login solo para descubrir que aún puedes usar tu nombre de usuario para iniciar sesión". <--- Mira el problema, todavía puedo usar un nombre de usuario, por eso este complemento no funcionará. Como no puedo eliminar los nombres de usuario, estoy pensando en anular la función de registro obligando al nombre de usuario a igualar la dirección de correo electrónico.
agentsmith666
Sin embargo, estoy buscando una manera de lograr esto sin editar los archivos principales. Si no es posible, está bien, pero me gustaría saber de cualquier manera. ¡Gracias!
agentsmith666
Esta es una manera sin editar los archivos principales. Copie el código en un complemento, actívelo y listo.
bueltge 01 de
4

Usando 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 comprobar que el nombre de usuario proporcionado al menos parecía un correo electrónico y, si no, sabotear el nombre de usuario.

Vigs
fuente
En lugar de la comprobación de cadena primitiva '@'en el nombre de usuario, Wordpress tiene una práctica función incorporada: sanitize_email devolverá un formato de dirección de correo electrónico válido o nada:sanitize_email('email¬!"@business_com'); // Returns nothing
indextwo
3

ya está adentro WP-CORE!

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

T.Todua
fuente
1

Leves modificaciones al código anterior deberían ser todo lo que se necesita para crear una solución elegante. La documentación para el enlace de autenticación indica que se debe devolver un WP_Userobjeto u WP_Errorobjeto.

El código fuente de la función wp_authenticate_username_password ejecuta algunas comprobaciones bastante simples; simplemente podemos replicar la forma en que se realizan esas verificaciones y crear un nuevo WP_Errorobjeto para tratar con la dirección de correo electrónico. Alternativamente, incluso podríamos conectar el wp_authenticate_username_passwordcódigo y modificarlo si quisiéramos, aunque eso parece innecesario a menos que realmente desee personalizar cómo funcionan las cosas. El siguiente código 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 );
}
Andrew Odri
fuente