Ich erstelle eine Mitgliedschaftsseite, auf der ich versuche, einen bestimmten Benutzer über einen Link an seine E-Mail-Adresse anzumelden.
Ich habe einen benutzerdefinierten Beitrag namens “Mitglieder”, wo ich einen eindeutigen Schlüssel mit dem Namen “user_key” gespeichert habe. Nach einem bestimmten Vorgang wird die E-Mail mit einem Link für die automatische Anmeldung an diesen Benutzer gesendet.
Ein Beispiel Link sieht wie folgt aus
http://example.com/process/?key=DcP2K7cmBUrLVRjizs78RAuuoMGRFc6F6TMDm6E6
process ist die Seite, die den Login-Teil behandelt. Hier ist der Code, der auf dieser Seite verwendet wird.
get_header(); $key = $_GET['key']; $args = array( 'post_type' => 'member', 'meta_value' => $key ); $properties = new WP_Query($args); if($properties->have_posts()) : while($properties->have_posts()) : $properties->the_post(); $author = $post->post_author; $user = get_user_by('ID', $author); $user_id = $user->ID; echo $user_id; wp_set_current_user($user_id, $loginusername); wp_set_auth_cookie($user_id); do_action('wp_login', $loginusername); wp_redirect( home_url() ); endwhile; endif; wp_reset_query(); get_footer();
Wenn ich zu diesem bestimmten Link gehe, erhalte ich den folgenden Fehler.
“Warnung: Header-Informationen können nicht geändert werden – bereits gesendete Header”
Von dem, was ich verstehe, ich denke, es ist der “wp_set_auth_cookie” Teil, der getan wird, nachdem die Header geladen werden, die dieses Problem verursacht.
Irgendjemand hat irgendwelche Ideen, wie man es repariert?
Sie können Header nicht senden, nachdem bereits eine Ausgabe erfolgt ist. Wenn Sie Inhalte hinzufügen möchten, die bei fehlgeschlagener Weiterleitung angezeigt werden sollen, fügen Sie die Kopf- und Fußzeile in den entsprechenden Codeblock ein:
//login code //if redirect happens, code execution halts, so there is no need for an if else get_header(); //error message get_footer();
Ein besserer Ansatz wäre, die user_id in der URL zu haben (vielleicht nicht einmal einen einfachen Text $code = get_user_meta( $user_id, 'activation_account_token', true );
und das Token vom Benutzer zu überprüfen ist dasselbe – für diese Frage nicht möglich) .
Der Grund für den Fehler ist dieses echo $user_id;
wp_clear_auth_cookie(); wp_set_current_user ( $user->ID ); wp_set_auth_cookie ( $user->ID ); wp_redirect( home_url() );
Sie sollten nichts ausgeben, bevor die Weiterleitung stattfindet.
Sie haben einige Möglichkeiten, wie Sie mit der Weiterleitung umgehen können:
Innerhalb der Motivvorlage bewegt sich der Weiterleitungscode über dem get_header();
function.php / Plugin
Eine bessere Option ist die Verwendung von wp_loaded
, das ausgetriggers wird, bevor HTML ausgegeben wird.
add_action ('wp_loaded', 'login_redirect'); function login_redirect() { if ( isset( $_GET['key'] ) ) { $user = get_users(array( 'meta_key' => 'key_or_the_name_you_use', 'meta_value' => $_GET['key'] , 'number' => 1, )); if(count($user) == 1){ $user_id =$user[0]->ID; wp_clear_auth_cookie(); wp_set_current_user ( $user_id ); wp_set_auth_cookie ( $user_id ); wp_redirect( home_url() ); exit; } } }
Dies ist, was Sie tatsächlich tun können, aber ich denke, dass Sie meine Antwort falsch gelesen haben, da die Benutzer-ID die Sicherheit erhöhen kann, um sie nicht zu verringern.
Durch das Einschließen der user_id kann die Benutzer-ID mit dem Token verknüpft werden, so dass jemand, der URLs zwangsweise zum Anmelden veranlasst, die zufällige Zeichenfolge mit dem Benutzer-ID-Konto abgleichen muss (was die Branche tatsächlich tut) – mit mehr Sicherheit Kontrollen.
echo "";
Dies kann in der Position von wp_redirect ausgegeben werden, damit der Browser die Umleitung vornimmt.
Da dies jedoch ein Browser-Redirect-Benutzer ist, kann die Ausführung von Javascript oder Weiterleitungen blockiert sein.