Comment se connecter avec email uniquement sans nom d'utilisateur?

16

Après une recherche de quelques jours et la lecture de discussions de 2 ans, j'ai du mal à trouver une solution au problème de connexion des utilisateurs uniquement par courrier électronique.

Au début, je suis ravi de voir WP_Email_Login uniquement pour savoir que vous pouvez toujours utiliser votre nom d'utilisateur pour vous connecter. Je ne suis pas sûr de savoir comment écrire cela en tant que plugin. Mon idée est de remplacer la fonction register_new_user. Je n'ai pas vu cela dans la liste des fonctions "enfichables". Puis-je utiliser des filtres / actions pour y parvenir?

Je réalise que ce n’est pas à la mode d’éditer les fichiers de base; j’espère donc qu’une solution existe, cependant, s’il n’en existe pas, je vais tenter ma chance. Dans la première ligne de la fonction "register_new_user" de wp-login.php, je peux ajouter:

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

Cela fonctionne assez bien puisque WordPress ne permet pas aux gens de changer leur nom d'utilisateur. Dans l’écran d’enregistrement (formulaire), il vous demande le nom d’utilisateur & Email; J'aimerais définir le nom d'utilisateur sur la variable de pseudonyme (si quelqu'un peut me dire comment s'appelle la variable de pseudonyme ou à quel endroit elle est définie lors de l'enregistrement, cela serait apprécié).

A bientôt,

Smith

    
posée agentsmith666 09.05.2012 - 22:44

6 réponses

15

Mise à jour: J'ai créé un plugin pour la connexion, l'enregistrement et la récupération du mot de passe par email. enlace

Répondez, vous pouvez configurer WordPress pour vous connecter avec un courrier électronique.

Trois étapes:

  • Supprimer la fonction d'authentification par défaut
  • Ajouter une fonction d'authentification personnalisée
  • Remplacez le texte "Nom d'utilisateur" dans wp-login.php par "Email"

Une note:

  • Ne modifiez pas les fichiers de base.

Supprimer la fonction d'authentification par défaut de WordPress.

WordPress utilise le filtre " authentifier " pour effectuer une validation supplémentaire lors de la connexion de l'utilisateur.

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

Ajouter une fonction d'authentification personnalisée

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

Remplacez le texte "Nom d'utilisateur" par "Email"

dans le fichier wp-login.php.

Nous pouvons utiliser le filtre gettext pour modifier le texte "Nom d'utilisateur" en "E-mail" sans modifier les fichiers de base.

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

J'ai également écrit un article détaillé sur mon blog enlace

.     
réponse donnée Nishant Kumar 12.06.2014 - 15:59
5

C'est possible, vous devez changer le filtre pour le nom.

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

Une alternative est un plugin, que vous trouverez via Google ou dans le dépôt du plugin; Peut-être ce plugin .

    
réponse donnée bueltge 10.05.2012 - 07:48
4

Utilisation du code ci-dessus:

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

Tout ce que nous devions faire était de vérifier que le nom d'utilisateur fourni ressemblait au moins à un courrier électronique et, dans le cas contraire, saboter le nom d'utilisateur.

    
réponse donnée Vigs 01.06.2013 - 02:34
3

il est déjà dans WP-CORE !

Wordpress permet déjà d’enregistrer EMAIL en tant que nom d’utilisateur. mais si vous parlez d’utilisateurs déjà enregistrés, essayez les réponses indiquées.

    
réponse donnée T.Todua 17.07.2016 - 21:46
0

De légères modifications au code ci-dessus devraient suffire à créer une solution élégante. La documentation sur le hook d'authentification indique qu'un objet WP_User ou WP_Error doit être renvoyé.

La code source de la fonction wp_authenticate_username_password effectue des vérifications assez simples; nous pouvons simplement reproduire la manière dont ces contrôles sont effectués et créer un nouvel objet WP_Error pour traiter l'adresse e-mail. Alternativement, nous pourrions même utiliser le code wp_authenticate_username_password et le modifier si nous le souhaitions, bien que cela semble inutile sauf si vous souhaitez vraiment personnaliser le fonctionnement des choses. Le code ci-dessous devrait faire l'affaire: (Même si je ne l'ai pas testé moi-même ...)

// 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 );
}
    
réponse donnée Andrew Odri 19.02.2014 - 20:31
0

Il existe un plugin pour cela:

Forcer la connexion par courrier électronique

enlace

C'est aussi sur Github: enlace

    
réponse donnée Lucas Bustamante 17.04.2018 - 16:29

Lire d'autres questions sur les étiquettes