it-swarm.com.de

Die automatische WordPress-Anmeldung nach der Registrierung funktioniert nicht

Ich habe eine Reihe von Threads durchgesehen, um herauszufinden, wie sich ein Benutzer nach der Registrierung automatisch anmeldet, und bin auf diese Idee gekommen.

function automatically_log_me_in( $user_id ) {
    $user = get_user_by('id',$user_id);
    $username = $user->user_nicename;
    $user_id = $user->ID;
    wp_set_current_user($user_id, $username);
    wp_set_auth_cookie($user_id);
    do_action('wp_login', $username, $user);
    exit;
}
add_action( 'user_register', 'automatically_log_me_in' );

Nach vielen Antworten, die ich gesehen habe, sollten wp_set_auth_cookie und wp_set_current_user allein ausreichen, um einen Benutzer anhand seiner ID einzuloggen, aber selbst das tut nichts.

Hat jemand eine Ahnung, was ich falsch mache?

5
Overcode

Kurze Antwort - Ihre ursprüngliche Funktion (meistens) funktioniert. Dies ist Ihre Funktion, die bearbeitet wird, um das zu tun, was es tun muss:

function automatically_log_me_in( $user_id ) {
    wp_set_current_user( $user_id );
    wp_set_auth_cookie( $user_id );
    wp_redirect( home_url( '/some-ending-page/' ) );
    exit(); 
}
add_action( 'user_register', 'automatically_log_me_in' );

Lange Antwort - Hier ist eine Erklärung, warum dies die Antwort ist.

Der Vorschlag von wp_signon() wird es nicht tun. Dazu benötigen Sie die Benutzeranmeldeinformationen. Wenn Sie die Anmeldeinformationen nicht weitergeben, versucht diese Funktion, den angegebenen Benutzernamen ('log') und das Kennwort ('pwd') aus dem Formular abzurufen. Ich gehe davon aus, dass 'pwd' darin fehlt.

Die anderen Antworten machen Vorschläge, die in diesem speziellen Fall leider nicht zutreffen. Einige sind Plugin-spezifische Vorschläge. Als Entwickler eines dieser (WP-Mitglieder) nützt Ihnen der Vorschlag, wpmem_post_register_data zu verwenden, nichts, wenn Sie keine WP-Mitglieder verwenden, so sehr Sie dieses Plugin verwenden möchten.

Die Verwendung von wp_set_current_user() als Ihr ursprünglicher Gedanke ist der richtige Weg, dies zu tun. aber Sie müssen den Benutzer am Ende umleiten damit er als angemeldet angesehen wird.

Die Aktion user_register übergibt die ID des gerade registrierten Benutzers. Daher bin ich mir nicht sicher, warum Sie den Wert von $user_id ändern würden, indem Sie ihn auf $user->ID setzen, wenn Sie den Wert bereits haben. Der einzige Grund, das Benutzerobjekt in Ihre ursprüngliche Funktion zu übernehmen, besteht darin, den Benutzernamen abzurufen. Dies ist ein optionales Argument für wp_set_current_user() und die wp_login -Aktion, damit ich mich nicht einmal darum kümmern würde. (Ich würde die wp_login -Aktion aufgeben, weil alles, was getan wird, ist, einen Hook in Ihren Prozess einzufügen, an den sich externe Funktionen anschließen können. Ob Sie dies wünschen/benötigen, erfordert mehr Informationen, als Ihr OP bereitstellt.) Code, IMO.

Ist Ihr Registrierungsprozess zu diesem Zeitpunkt beendet? Das Authentifizierungscookie wird gesetzt und der Benutzer ist angemeldet. Dies wird jedoch erst bei der nächsten Seitenanforderung gelesen, sodass Sie den Benutzer zu der Seite umleiten müssen, auf der er wp_redirect() verwenden soll. Danach müssen Sie exit() verwenden.

2
butlerblog

Ich registriere Benutzer mit einem benutzerdefinierten Registrierungsformular, das auf wp-login.php verweist

Dann könnten Sie wp_signon function verwenden. Geben Sie weitere Details an, um eine andere Lösung vorzuschlagen.

1
phpsmashcode

Ich registriere Benutzer mit einem benutzerdefinierten Registrierungsformular, das auf wp-login.php verweist. Könnte es das sein?

Probieren Sie eine dieser Funktionen aus. Sie können auswählen, auf welche Seite in der ersten umgeleitet werden soll. Der zweite ist eher der, den Sie versucht haben. Sie können arbeiten oder helfen.

add_action( 'tml_new_user_registered', 'tml_new_user_registered' );
function tml_new_user_registered( $user_id ) {
    wp_set_auth_cookie( $user_id, false, is_ssl() );
    wp_redirect( admin_url( 'profile.php' ) );
    exit;
}

oder

add_action( 'wpmem_post_register_data', 'my_registration_hook', 1 );
function my_registration_hook( $fields ) {
    $user_login = $fields['username'];
    $user_id = $fields['ID'];

    wp_set_current_user( $user_id );
    wp_set_auth_cookie( $user_login );
    do_action( 'wp_login', $user_login );

    wp_set_current_user( $fields['ID'] );
}
1
matthew

Sie müssen diesen Code ausführen, bevor Header an den Client gesendet werden. Versuchen Sie, den Login-Code zu trennen.

Diese Frage ist fast ein Jahr alt, also lass es uns wissen, wenn etwas funktioniert hat.

0