Wie melde ich mich mit E-Mail nur ohne Benutzername an?

19

Nachdem ich ein paar Tage gesucht und 2 Jahre alte Threads gelesen habe, habe ich Schwierigkeiten, eine Lösung für das Problem zu finden, dass sich Benutzer nur per E-Mail anmelden.

Zuerst freute ich mich, WP_Email_Login zu sehen, nur um herauszufinden, dass Sie Ihren Benutzernamen weiterhin zum Anmelden verwenden können. Ich bin mir nicht sicher, wie ich das als Plugin schreiben soll. Meine Idee ist es, die Funktion register_new_user zu überschreiben. Ich habe dies nicht auf der "steckbaren" Funktionsliste gesehen. Kann ich Filter / Aktionen verwenden, um dies zu erreichen?

Mir ist klar, dass es nicht in Mode ist, die Kerndateien zu bearbeiten. Ich hoffe, dass es eine Lösung gibt, aber wenn es keine gibt, gehe ich mein Risiko ein. In der ersten Zeile der Funktion "register_new_user" in wp-login.php kann ich hinzufügen:

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

Dies funktioniert sehr gut, da WordPress es nicht erlaubt, den Benutzernamen zu ändern. Auf dem Registrierungsbildschirm (Formular) werden Sie nach dem Benutzernamen und der E-Mail-Adresse gefragt. Ich möchte den Benutzernamen auf die Variable "Spitzname" setzen (wenn mir jemand sagen kann, wie die Spitznamenvariable heißt oder wo sie bei der Registrierung festgelegt wurde, wäre das wünschenswert).

Prost,

Schmied

agentsmith666
quelle
Versuchen Sie, Benutzernamen gänzlich zu beseitigen? Warum funktioniert das Plugin für die E-Mail-Anmeldung bei Ihnen nicht?
Ryan
Ich bin wirklich neugierig, warum Sie auf Benutzernamen verzichten möchten, da diese die Grundlage für alle Benutzerinformationen in WordPress sind. Es ist ein bisschen so, als würde man versuchen, Posts zu beseitigen - viel Arbeit für nicht viel Geld und eine Garantie für spätere Probleme.
SickHippie
1
@ Ryan- Ich glaube nicht, dass ich Benutzernamen loswerden kann. Stattdessen zwinge ich den Benutzernamen, der E-Mail-Adresse zu entsprechen.
agentsmith666
@SickHippie - für die Anmeldung finde ich E-Mails besser und eindeutiger als ein Benutzername. Ich würde lieber den Benutzernamen als den Spitznamen verwenden, wenn der Benutzer Beiträge verfasst. Sie haben Recht, es wäre mühsam, die Variable "Benutzername" loszuwerden, weshalb ich es nicht bin. Ich wähle nur den Benutzernamen für den Benutzer, wenn er sich registriert (Benutzername ist seine E-Mail-Adresse; Spitzname ist das, was er als Benutzername eingegeben hat). Am Ende gehen keine Variablen verloren, alles ist intakt.
agentsmith666
1
@SickHippie - Sie haben Recht, da Wordpress standardmäßig nicht zulässt, dass Benutzer ihren Benutzernamen und ihre E-Mail-Adresse ändern, auch wenn sie ihre Kontakt-E-Mail-Adresse ändern. Ich habe das von Anfang an in Betracht gezogen und nach meiner eigenen Erfahrung festgestellt, dass Leute selten eine E-Mail-Adresse "löschen". Sie können neue bekommen, aber in der Regel werden sie noch ihre alten haben. Und wenn nicht, werden wir es unter diesen seltenen Umständen manuell in der Datenbank ändern. Ich freue mich sehr über Ihr Feedback und Ihren Einblick in SickHippie! Jetzt hoffe ich auf eine Lösung für meinen Beitrag :)
agentsmith666

Antworten:

18

Update: Ich habe ein Plugin für Login, Registrierung und Passwortabfrage per E-Mail erstellt. https://wordpress.org/plugins/smart-wp-login/

Kurz gesagt, Sie können WordPress so konfigurieren, dass es sich per E-Mail anmeldet.

Drei Schritte:

  • Entfernen Sie die Standardauthentifizierungsfunktion
  • Benutzerdefinierte Authentifizierungsfunktion hinzufügen
  • Ändere den Text "Username" in wp-login.php in "Email"

Eine Note:

  • Bearbeiten Sie keine Core-Dateien.

Entfernen Sie die Standardauthentifizierungsfunktion von WordPress.

WordPress verwendet den " Authentifizierungs " -Filter, um eine zusätzliche Überprüfung bei der Benutzeranmeldung durchzuführen.

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

Benutzerdefinierte Authentifizierungsfunktion hinzufügen

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

Ändere den Text "Username" in wp-login.php in "Email"

Wir können den gettext- Filter verwenden, um den Text "Benutzername" in "E-Mail" zu ändern, ohne die Kerndateien zu bearbeiten.

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

Ich habe auch einen detaillierten Artikel in meinem Blog geschrieben: http://www.thebinary.in/blog/wordpress-login-using-email/

Nishant Kumar
quelle
2
Schöne Antwort Nishant
Andrew Bartel
nützlich! In meinem Fall entferne ich einfach E-Mail-Sonderzeichen und mache daraus einen Benutzernamen. [email protected] wird zu user_example_com und es hat funktioniert.
wpcoder
6

Möglicherweise müssen Sie den Filter für den Namen ändern.

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

Eine Alternative ist ein Plugin, das Sie über Google oder im Plugin Repo finden; Vielleicht dieses Plugin .

bueltge
quelle
Vielen Dank für die Antwort. Ich bin mir jedoch nicht sicher, ob Sie meinen Beitrag gelesen haben oder ob ich nicht klar genug war. Ich entschuldige mich für letzteres. In meinem ursprünglichen Beitrag habe ich das WP_Email_Login-Plugin erwähnt. Das genaue Plugin, aus dem Ihr Code und Link stammt. Hier ist mein ursprünglicher Beitrag: "Zuerst freute ich mich, WP_Email_Login zu sehen, nur um herauszufinden, dass Sie Ihren Benutzernamen weiterhin zum Anmelden verwenden können." <--- Siehe das Problem, dass ich immer noch einen Benutzernamen verwenden kann, weshalb dieses Plugin nicht funktioniert. Da ich die Benutzernamen nicht beseitigen kann, denke ich daran, die Registrierungsfunktion zu überschreiben, indem ich den Benutzernamen zwinge, der E-Mail-Adresse zu entsprechen.
agentsmith666
Ich suche jedoch nach einer Möglichkeit, dies zu erreichen, ohne die Kerndateien zu bearbeiten. Wenn es nicht möglich ist, ist das in Ordnung, aber ich möchte es so oder so wissen. Vielen Dank!
agentsmith666
Dies ist ein Weg, ohne die Kerndateien zu bearbeiten. Kopieren Sie den Code in ein Plugin, aktivieren und fertig.
Bueltge
4

Verwenden Sie den obigen Code:

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

Wir mussten nur überprüfen, ob der angegebene Benutzername mindestens wie eine E-Mail aussah und den Benutzernamen, falls nicht, sabotieren.

Vigs
quelle
Anstelle der primitiven Zeichenfolgeprüfung für '@'den Benutzernamen verfügt Wordpress über eine praktische integrierte Funktion: sanitize_email gibt entweder ein gültiges E-Mail-Adressformat oder nichts zurück:sanitize_email('email¬!"@business_com'); // Returns nothing
Indextwo
3

es ist schon in WP-CORE !

Jetzt erlaubt WordPress bereits, EMAIL als Benutzernamen zu registrieren. Wenn Sie jedoch über bereits registrierte Benutzer sprechen, versuchen Sie es mit den aufgeführten Antworten.

T.Todua
quelle
1

Leichte Änderungen am obigen Code sollten alles sein, was für eine elegante Lösung erforderlich ist. Das Dokumentation für den Authentifizierungs-Hook gibt an, dass entweder ein WP_UserObjekt oderWP_Error Objekt zurückgegeben werden soll.

Der Quellcode für die Funktion wp_authenticate_username_password durchläuft einige ziemlich einfache Prüfungen. Wir können einfach die Art und Weise replizieren, wie diese Prüfungen durchgeführt werden, und ein neues WP_ErrorObjekt erstellen , um mit der E-Mail-Adresse umzugehen. Alternativ können wir den wp_authenticate_username_passwordCode sogar aufbocken und nach Belieben ändern, obwohl dies unnötig erscheint, es sei denn, Sie möchten die Funktionsweise wirklich anpassen. Der folgende Code sollte den Trick machen: (Obwohl ich es selbst nicht getestet habe ...)

// 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
quelle