Setcookie arbeitet mit Admin, aber nicht mit Frontend

Ich habe eine einfache function, um einen Cookie auf den Wert eines beliebigen Parameters zu setzen. Wenn ich beispielsweise http://example.com/?devsource=http://dev.example.com/ aufruft, sollte der Wert des devsourceurl-Cookies auf http://dev.example.com/ gesetzt werden.

Diese function funktioniert gut im WordPress-Admin, aber ich kann es nicht am Frontend arbeiten. Ich habe sogar versucht zu überprüfen, ob Header bereits bei der Init-Aktion gesendet wurden und sie nicht waren. Irgendwelche Ideen, was könnte das verursachen? Hier ist der Code:

function set_devsource_cookie() { if ($_GET['devsource']) { $value = $_GET['devsource']; setcookie("devsourceurl", $value, time()+3600, COOKIEPATH, COOKIE_DOMAIN, false ); echo $_COOKIE["devsourceurl"]; /* echo cookie if set */ } } add_action('init', 'set_devsource_cookie', 0); 

Danke für jede Hilfe!

Solutions Collecting From Web of "Setcookie arbeitet mit Admin, aber nicht mit Frontend"

Einige Dinge, die in Bezug auf Cookies nicht WordPress-spezifisch sind:

  • Set-Cookie schlägt fehl, wenn auf der Seite etwas ausgegeben wurde
  • Sie können nicht auf den Coockie-Wert in derselben Anfrage zugreifen, die Sie festgelegt haben (wie @Milo in einem Kommentar zum OP angegeben hat)

Eine andere allgemeine Regel ist besser, filter_input oder filter_intput_array anstatt direkt auf Super-Globals wie $_GET oder $_COOKIE .

Als direkte Folge der ersten Sache, die ich sagte (Set-Cookie schlägt fehl, wenn einige Ausgabe) ist besser so Cookie wie möglich, und in WordPress selbst wenn ‘init’ ist ziemlich früh, gibt es Haken, die früher sind, wenn Sie schreiben ein Plugin, das du 'plugin_loaded' verwenden 'plugin_loaded' wenn du ein Theme entwickelst, das du 'after_setup_theme' verwenden 'after_setup_theme' .

 function set_devsource_cookie() { global $devsource; $get = filter_input( INPUT_GET, 'devsource', FILTER_SANITIZE_STRING ); if ( ! empty( $get ) ) { $devsource = $get; setcookie( 'devsourceurl', $devsource, time() + 3600, COOKIEPATH, COOKIE_DOMAIN, false ); } else { $cookie = filter_input( INPUT_COOKIE, 'devsourceurl', FILTER_SANITIZE_STRING ); if ( ! empty( $cookie ) ) { $devsource = $cookie; } } // debug // die( '---------------------'); // uncommenting previous line, the dashes must be the the absolutely first line // if there's something first, even an empty line the cookie can't be set! } // prefer this on plugin // add_action( 'plugins_loaded', 'set_devsource_cookie', 0 ); add_action( 'after_setup_theme', 'set_devsource_cookie', 0 ); 

Jetzt testen, ob der Wert auf wp footer gesetzt wurde (genau wie im Beispiel):

 function test_devsource_cookie() { global $devsource; echo 'Devsource is: '; echo ! empty( $devsource ) ? $devsource : 'not set.'; echo '
Set again to random uri: '; $random = strtolower( wp_generate_password( 6, FALSE, FALSE ) ); $url = add_query_arg( array('devsource' => "http://dev.{$random}.com/" ) ); echo 'Set'; } add_action( 'wp_footer', 'test_devsource_cookie' );

Wenn dieser Code nicht funktioniert, wird wahrscheinlich etwas (ein Plugin, das Theme) etwas auf der Seite ausgegeben bevor der Code ausgeführt wird, manchmal sogar eine Leerzeile bevor das < ?php fehlschlagen kann ein Cookie gesetzt wird, siehe die kommentierten Zeilen in meiner set_devsource_cookie function.

Wenn Sie eine Ausgabe auf der Seite sehen, deaktivieren Sie alle Plugins und verwenden Sie ein Standardthema, fügen Sie meinen Code in ein Plugin ein und aktivieren Sie ihn nur: Der Code sollte funktionieren.

Danach aktivieren Sie Ihr Theme und die Plugins nacheinander, um den Täter zu finden.

Letzter Tipp: Wenn Sie URLs als Parameter an die URL übergeben müssen, achten Sie darauf, urlencode zu verwenden, und zwar auf meine test_devsource_cookie function.