it-swarm.com.de

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

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

16
agentsmith666

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 Filter " authenticate ", 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 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 ausführlichen Artikel in meinem Blog geschrieben http://www.thebinary.in/blog/wordpress-login-using-email/

15
Nishant Kumar

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 .

5
bueltge

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, falls nicht, den Benutzernamen sabotieren.

4
Vigs

es ist bereits 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.

3
T.Todua

Leichte Änderungen am obigen Code sollten alles sein, was für eine elegante Lösung erforderlich ist. Die Dokumentation für den Authentifizierungs-Hook gibt an, dass entweder ein WP_User-Objekt oder ein WP_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_Error-Objekt erstellen, das mit der E-Mail-Adresse umgeht. Alternativ könnten wir sogar den wp_authenticate_username_password-Code aufbocken und ihn ändern, wenn wir möchten, obwohl dies unnötig erscheint, es sei denn, Sie möchten wirklich anpassen, wie die Dinge funktionieren. 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 );
}
0
Andrew Odri

Dafür gibt es ein Plugin:

E-Mail-Anmeldung erzwingen

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

Es ist auch auf Github: https://github.com/miya0001/force-email-login

0