web-dev-qa-db-fra.com

Comment se connecter avec email seulement sans identifiant?

Après avoir cherché quelques jours et lu des discussions de deux ans, j'ai du mal à trouver une solution au problème de connexion des utilisateurs uniquement par courrier électronique.

Au début, j'étais 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/action 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 demande le nom d’utilisateur et l’adresse électronique; J'aimerais définir le nom d'utilisateur sur la variable pseudo (si quelqu'un peut me dire comment la variable pseudo est appelée ou où elle est définie lors de l'enregistrement, cela serait apprécié).

À votre santé,

Forgeron

16
agentsmith666

Mise à jour: J'ai créé un plugin pour la connexion, l'enregistrement et la récupération du mot de passe par courrier électronique. https://wordpress.org/plugins/smart-wp-login/

En bref, 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 " authenticate " 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" dans wp-login.php par "Email"

Nous pouvons utiliser gettext filter pour changer 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 http://www.thebinary.in/blog/wordpress-login-using-email/

15
Nishant Kumar

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 ici via Google ou dans le dépôt de plugin; peut-être ce plugin .

5
bueltge

En utilisant le 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 avions à 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.

4
Vigs

c'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.

3
T.Todua

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

Le code source de la fonction wp_authenticate_username_password effectue quelques 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 électronique. Alternativement, nous pourrions même utiliser le code wp_authenticate_username_password et le modifier si nous le voulions, 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 );
}
0
Andrew Odri

Il y a un plugin pour ça:

Forcer la connexion par e-mail

https://br.wordpress.org/plugins/force-email-login/

C'est aussi sur Github: https://github.com/miya0001/force-email-login

0
Lucas Bustamante