Ist es möglich, das Benutzername-Feld von der Registrierungsseite zu entfernen? Wenn das so ist, wie?

16

Ist es möglich, das Feld für den Benutzernamen von der Registrierungsseite zu entfernen?

Ich möchte, dass die Benutzer nur ihre E-Mail-Adresse und ihr Passwort eingeben.
Ein neuer Benutzer sollte nur anhand dieser beiden Parameter erstellt werden.

Ist das möglich und wenn ja, wie?

phpnwordpress
quelle

Antworten:

11

Absolut JA , das können Sie erreichen.

Regel 1: WordPress benötigt einen Benutzernamen. Wir müssen einen Benutzernamen angeben.

Regel 2: Bearbeiten Sie den WordPress-Kerncode nicht.

Wir können dies erreichen, indem wir das Feld "Benutzername" verbergen, eine E-Mail erhalten und es als Benutzername speichern.

Schritt-1: Entfernen Sie das Textfeld Benutzername

add_action('login_head', function(){
?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript" src="<?php echo site_url('/wp-includes/js/jquery/jquery.js'); ?>"></script>
    <script type="text/javascript">
        jQuery(document).ready(function($){
            $('#registerform > p:first-child').css('display', 'none');
        });
    </script>
<?php
});

Schritt 2: Entfernen Sie den Benutzernamen-Fehler

//Remove error for username, only show error for email only.
add_filter('registration_errors', function($wp_error, $sanitized_user_login, $user_email){
    if(isset($wp_error->errors['empty_username'])){
        unset($wp_error->errors['empty_username']);
    }

    if(isset($wp_error->errors['username_exists'])){
        unset($wp_error->errors['username_exists']);
    }
    return $wp_error;
}, 10, 3);

Schritt 3: Hintergrundregistrierungsfunktionalität manipulieren.

add_action('login_form_register', function(){
    if(isset($_POST['user_login']) && isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
});

Fügen Sie den obigen Code in die Datei functions.php Ihres Themas ein .

Sie können auch ein vollständiges Plugin herunterladen, um dies zu erreichen.

Plugin: https://wordpress.org/plugins/smart-wp-login/

Nishant Kumar
quelle
4

Schritt 3 im Beitrag von Nishant Kumars überprüft, ob isset($_POST['user_login'])das bei mir nicht funktioniert hat, da das Login das ist, was wir eigentlich entfernen wollen.

Meine Lösung lautet wie folgt (in der Datei functions.php des Themas), auch als separate Funktion, um beim WordPress-Codestil zu bleiben:

function copy_username_to_email (){
    if(isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
}
add_action('login_form_register', 'copy_username_to_email');
Magnesium
quelle
Ich erhielt die Fehlermeldung "Ungültige Zeichen" @und ersetzte das und .in der E-Mail-Adresse als Benutzernamen:$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
GreatBlakes
4

@Nishant Kumar gab die perfekte und zu akzeptierende Antwort auf diese Frage. Es gibt jedoch einen Fehler nach der Veröffentlichung der Wordpress 4.0-Version. Aus dem Kodex -

Hinweis: Seit 4.0 sind diese Eigenschaften privat, siehe [28511] .

registration_errors Filter hier erfordert eine kleine Änderung.

//Remove error for username, only show error for email only.

add_filter('registration_errors', 'remove_username_empty_error', 10, 3);

function remove_username_empty_error($wp_error, $sanitized_user_login, $user_email){

    if(isset($wp_error->errors['empty_username'])){
        $wp_error->remove('empty_username');
    }    
    if(isset($wp_error->errors['username_exists'])){
        $wp_error->remove('username_exists');
    }
    return $wp_error;
}

Hinweis: Wie @mcnesium erwähnt, wenn wir vollständig aus dem Feld Benutzername losgeworden (in meinem Fall habe ich Theme Anmeldungs Plugin die reguläre Anmeldeformular außer Kraft zu setzen und dort habe ich nur den Benutzernamen Feld entfernt) , dann $_POST['user_login']wird nullund der Zustand nicht übereinstimmen überhaupt. Wir sollten das besser aus dem Zustand entfernen, wie es @mciterranean vorschlägt.

maksbd19
quelle
2

Nach der Antwort von @ nishant-kumar ist hier ein Vanille-JS, kein zusätzliches JS-Skript, 1 Schritt, keine Backend-Bearbeitung erforderlich, Lösung, um ein Anmeldeformular nur mit der E-Mail-Eingabe zu erstellen:

/** Hook your code to the login / Sign up page **/
add_action('login_head', function(){

    /* Style to hide the user_name field group */
    ?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript">
        /* Execute this action when the DOM is ready AND after everything in the page is loaded */
        let user_email;
        window.addEventListener('load',function() {
            user_email = document.querySelector('[name="user_email"]');
            if(user_email) { // Execute only if there is a user_email field on page
                user_email.addEventListener('keyup',syncUserName);
                user_email.addEventListener('change',syncUserName);
            }
        });

        /* sync user_email's value with the hidden user_login field */
        function syncUserName() {
                document.querySelector('[name="user_login"]').value = user_email.value;
        }

    </script>
<?php
});

Sie müssen nur diesen Code in Ihre functions.php- Datei einfügen (oder in Ihr benutzerdefiniertes Plugin , falls Sie eines haben)

Gfra54
quelle
1
Ich habe es versucht und einen Fehler bekommen user_email is not defined at HTMLInputElement.syncUserName. Das Verschieben des Teils "function syncUserName" innerhalb der oberen Funktion behebt den Fehler und das Code-Snippet funktioniert sehr gut. Kommentieren Sie einfach, damit andere auf dasselbe Problem stoßen. Vielen Dank Gfra54.
Betty
Sie haben vollkommen recht @betty, ich habe meine Antwort korrigiert, um die Variable user_emailin den gleichen Bereich zu setzen. Vielen Dank.
Gfra54
1

Ich denke, dass jede Lösung für diese Anfrage ein "Hack" sein wird, da WordPress erfordert, dass es einen Benutzernamen für alle registrierten Benutzer gibt. Selbst das oben erwähnte Plugin findet höchstwahrscheinlich nur den Benutzernamen über die E-Mail-Adresse und verwendet diesen Benutzernamen, um sich auf der Site anzumelden.

Wenn Sie mit einem Hack einverstanden sind, ist hier ein Konzept, das funktionieren könnte:

1) Füllen Sie das Feld "Benutzername" in Ihrem Registrierungsformular mit einer eindeutigen Nummer aus. Verwenden Sie den aktuellen Zeitstempel, um zu vermeiden, dass Sie jemals Duplikate erhalten. Sie würden dieses Feld dann ausblenden, damit der Benutzer es beim Ausfüllen seines Formulars nicht auf dem Bildschirm sieht.

Wenn Sie jQuery verwenden, können Sie Folgendes verwenden:

$(document).ready(function() {
    var timestamp = (new Date).getTime();
    $('form input.username').val(timestamp);
    $('form input.username').css('display', 'none');
});

In diesem Beispiel wäre 'form input.username' der jQuery-Selektor, um das Feld username zu finden. Sie müssen die HTML-Struktur auf Ihrer Seite überprüfen, um sicherzustellen, dass der Selektor mit der Struktur übereinstimmt.

2) Verwenden Sie ein Plugin wie das zuvor erwähnte ( http://wordpress.org/extend/plugins/wp-email-login/ ), damit sich Benutzer mit ihrer E-Mail-Adresse anmelden können.

Matt Keys
quelle