Deaktivierung des Login-Formulars und Umleitung der Benutzer beim Abmelden ohne Header gesendet php warning

Ich habe meine eigenen Anmelde- und Registrierungsformulare erstellt, also brauchte ich eine Möglichkeit, das Standard-Login-Formular zu deaktivieren.

Außerdem musste der Benutzer bei der Abmeldung an einen anderen Ort und nicht an das Login-Formular weitergeleitet werden.

Ich habe diese Logik entwickelt. Eröffnete wp-login.php und fand den ersten Haken. Das war login_head .

Also habe ich mich eingehakt und ich umadressiere nur, wenn der Benutzer ein geheimes Token gibt.

 function e4_login_form_disable() { if ( ! isset( $_GET['gandalf'] ) || $_GET['gandalf'] != 'thewhite' ) { wp_redirect( home_url() ); exit; } } 

Bin ich damit einverstanden oder fehlt mir etwas?

ZUSÄTZLICHE INFO: Ich erhalte die folgende Warnung: "Warning: Cannot modify header information - headers already sent by (output started at /public_html/site/wp-login.php:63) in site/wp-includes/pluggable.php on line 1171 "

Es sieht so aus, als könnte es funktionieren, wenn Sie output_buffering in der php.ini aktivieren und diese Datei in das Verzeichnis legen, in dem sich die .php-Datei befindet, die die Warnung erzeugt.

Aber es scheint wie ein “Hack” …

Solutions Collecting From Web of "Deaktivierung des Login-Formulars und Umleitung der Benutzer beim Abmelden ohne Header gesendet php warning"

Die Warnung, die Sie erhalten, besteht darin, dass Sie den Browser nicht auf eine andere Seite redirect können, nachdem Sie bereits Inhalt für die aktuelle Seite an ihn gesendet haben.

Der Rest des Fehlers teilt Ihnen die genaue Datei mit, die den Inhalt sendet, den Sie noch nicht möchten. Sie müssen entweder:

  • Stellen Sie sicher, dass Sie Ihre Weiterleitung in einem früheren Hook ausführen, bevor dieser Inhalt ausgegeben werden kann. oder
  • Korrigieren Sie, was diesen Inhalt verursacht, damit die Weiterleitung wie gewünscht funktioniert

In Ihrem Fall kommt die Ausgabe von wp-login.php da sie das eigentliche Anmeldeformular ausgibt. Das bedeutet, dass du dich einklinken musst, bevor dies passiert.

Ich kann sehen, was Sie hier getan haben, und es ist ein häufiger Fehler: Sie haben die login_head Aktion gefunden, auf die zuvor in dieser function Bezug genommen wurde (um Zeile 37 von wp-login.php ), und versucht, sich wp-login.php . Die Sache ist, der Code add_action( 'login_head', 'wp_no_robots' ); dass Sie hier gesehen haben, ist tatsächlich in login_head selbst login_head ; Es wird die Aktion nicht ausgeführt.

Im weiteren Verlauf von wp-login.php finden wir in dieser function do_action( 'login_head' ); Um Zeile 98 ( do_action statt add_action ). Dies ist der Zeitpunkt, an dem Ihr Code tatsächlich ausgeführt wird, was leider auf die Ausgabe folgt, die bereits von WordPress gesendet wurde (der Start der Login-Seite).

Also müssen wir uns einen früheren Haken suchen. Da wir weiterleiten, sollten wir so früh wie möglich fortfahren, sonst könnten wir WordPress dazu bringen, eine Menge Arbeit zu leisten, die es auf der Seite, auf die wir redirect, noch einmal tun muss. Wenn Sie sich die Action Reference im Codex ansehen, ist init ein ziemlich früher Haken, der klingt, als könnte er unsere Bedürfnisse erfüllen.

Ausgezeichnet. Versuchen Sie, Ihre login_head function zu login_head , um init anstelle von login_head .

ABER , es gibt einen weiteren Schritt, den wir machen müssen … sonst werden wir jeden Benutzer auf jeder Seite redirect!

In Ihrer function müssen Sie jetzt auch prüfen, ob die Anmeldeseite angezeigt wird. Leider bietet WordPress keine is_login_page() -function, daher können wir dies stattdessen mit einer schnellen statement tun, die die globale pagenow Variable überprüft:

 if($GLOBALS["pagenow"] == "wp-login.php"){ /* do redirect here */ } 

Wenn Sie das alles zusammenfügen, sollten Sie jetzt erfolgreich von der Anmeldeseite wegleiten können (ich habe das noch nicht getestet!):

 function e4_login_form_disable() { if ( $GLOBALS['pagenow'] == 'wp-login.php' ){ if ( ! isset( $_GET['gandalf'] ) || $_GET['gandalf'] != 'thewhite' ) { wp_redirect( home_url() ); exit; } } } add_action('init', 'e4_login_form_disable'); 

In Bezug auf die Ausgabe-Pufferung, ja, das funktioniert technisch, aber es ist definitiv hacky, und Sie sollten es nicht verwenden, wenn es eine Alternative gibt. Es wird auch jede Weiterleitung etwas verlangsamen.