Comment se connecter par e-mail uniquement sans nom d'utilisateur?

20

Après avoir recherché quelques jours et lu des fils de discussion de 2 ans, j'ai du mal à trouver une solution au problème de la connexion des utilisateurs par e-mail uniquement.

Au début, j'étais ravi de voir WP_Email_Login uniquement pour découvrir que vous pouvez toujours utiliser votre nom d'utilisateur pour vous connecter. Je ne sais pas trop comment écrire ceci en tant que plugin. Mon idée est de remplacer la fonction register_new_user. Je ne l'ai pas vu sur la liste des fonctions "enfichables". Puis-je utiliser des filtres / action pour y parvenir?

Je me rends compte que ce n'est pas à la mode d'éditer les fichiers de base, donc j'espère qu'une solution est là, mais si elle n'existe pas, je vais tenter ma chance. Dans la première ligne de la fonction "register_new_user" dans 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 très bien car 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 e-mail; Je voudrais définir le nom d'utilisateur sur la variable de surnom (si quelqu'un peut me dire comment la variable de surnom est appelée ou où elle est définie lors de l'inscription, ce serait apprécié).

À votre santé,

Forgeron

agentsmith666
la source
Essayez-vous de supprimer complètement les noms d'utilisateur? Pourquoi le plugin Email Login ne fonctionne-t-il pas pour vous?
Ryan
Je suis vraiment curieux de savoir pourquoi vous souhaitez supprimer les noms d'utilisateur, car ils sont à la base de toutes les informations utilisateur dans WordPress. C'est un peu comme essayer de supprimer les messages - beaucoup de travail pour pas beaucoup de gains, et une garantie de problèmes en cours de route.
SickHippie
1
@ Ryan - Je ne pense pas que je serai en mesure de me débarrasser des noms d'utilisateur, alors je force simplement le nom d'utilisateur à égaler l'adresse e-mail.
agentsmith666
@SickHippie - pour la connexion, je pense que le courrier électronique est meilleur et plus unique qu'un nom d'utilisateur. Je préfère utiliser le nom d'utilisateur comme surnom lorsque l'utilisateur publie. Vous avez raison, il serait difficile de se «débarrasser» de la variable «nom d'utilisateur», c'est pourquoi je ne le suis pas. Je choisis simplement le nom d'utilisateur de l'utilisateur lors de son inscription (le nom d'utilisateur sera son adresse e-mail; son surnom sera ce qu'il a entré comme nom d'utilisateur). Au final aucune variable n'est perdue tout est intact.
agentsmith666
1
@SickHippie - Vous avez raison, car la valeur par défaut de Wordpress n'est pas de permettre à l'utilisateur de changer son nom d'utilisateur, son nom d'utilisateur / adresse e-mail resterait le même même s'il devait changer son adresse e-mail de contact. J'ai considéré que depuis le début et dans ma propre expérience, j'ai constaté que les gens "supprimaient" rarement une adresse e-mail. Ils peuvent en obtenir de nouveaux, mais généralement ils auront toujours leurs anciens. Et si ce n'est peut-être pas dans ces rares circonstances, nous le modifierons manuellement dans la base de données. J'apprécie vraiment vos commentaires et idées SickHippie! J'espère maintenant une solution à mon message :)
agentsmith666

Réponses:

19

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

Répondez en bref, vous pouvez configurer WordPress pour vous connecter par e-mail.

Trois étapes:

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

Une note:

  • Ne modifiez pas les fichiers principaux.

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

WordPress utilise un 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);

Changer le texte "Nom d'utilisateur" dans wp-login.php en "Email"

Nous pouvons utiliser le filtre gettext pour changer le texte "Nom d'utilisateur" en "Email" 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/

Nishant Kumar
la source
2
Belle réponse Nishant
Andrew Bartel
utile! Dans mon cas, je supprime simplement les caractères spéciaux du courrier électronique et en fais un nom d'utilisateur. donc [email protected] devient user_example_com et cela a fonctionné.
wpcoder
6

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 repo du plugin; peut - être ce plugin .

bueltge
la source
Merci pour la réponse mais je ne sais pas si vous avez lu mon post ou si je n'ai pas été assez clair. Je m'excuse pour ce dernier. Dans mon article d'origine, j'ai mentionné le plugin WP_Email_Login; le plugin exact d'où provient votre code et votre lien. Voici mon message d'origine: "Au début, j'étais ravi de voir WP_Email_Login seulement pour découvrir que vous pouvez toujours utiliser votre nom d'utilisateur pour vous connecter." <--- Voir le problème, je peux toujours utiliser un nom d'utilisateur, c'est pourquoi ce plugin ne fonctionnera pas. Comme je ne peux pas supprimer les noms d'utilisateur, je pense remplacer la fonction d'enregistrement en forçant le nom d'utilisateur à égaler l'adresse e-mail.
agentsmith666
Cependant, je cherche un moyen d'accomplir cela sans modifier les fichiers de base. Si ce n'est pas possible, c'est bien mais j'aimerais savoir de toute façon. Merci!
agentsmith666
c'est un moyen sans modifier les fichiers de base. Copiez le code dans un plugin, activez et prêt.
bueltge
4

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 e-mail et sinon de saboter le nom d'utilisateur.

Vigs
la source
Plutôt que la vérification de chaîne primitive '@'dans le nom d'utilisateur, Wordpress a une fonction intégrée pratique: sanitize_email retournera soit un format d'adresse e-mail valide, soit rien:sanitize_email('email¬!"@business_com'); // Returns nothing
indextwo
3

c'est déjà dedans WP-CORE!

maintenant wordpress permet déjà d'enregistrer EMAIL comme nom d'utilisateur. mais si vous parlez d'utilisateurs déjà enregistrés, essayez les réponses répertoriées.

T.Todua
la source
1

De légères modifications au code ci-dessus devraient être tout ce qui est nécessaire pour créer une solution élégante. La documentation du hook d'authentification indique qu'un WP_Userobjet ou un WP_Errorobjet doit être retourné.

Le code source de la fonction wp_authenticate_username_password passe par des vérifications assez simples; nous pouvons simplement reproduire la façon dont ces vérifications sont effectuées et créer un nouvel WP_Errorobjet pour gérer l'adresse e-mail. Alternativement, nous pourrions même valider le wp_authenticate_username_passwordcode et le modifier si nous le voulions, bien que cela semble inutile, sauf si vous voulez 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 );
}
Andrew Odri
la source