Drei Tage lang wäre ich fast verzweifelt, als ich eine WordPress-Seite um ein selbstgeschriebenes Login-Script erweitern wollte. Lokal funktionierte alles einwandfrei, doch sobald ich es hochgeladen hatte, schienen die Session-Variablen nicht mehr übernommen zu werden: nach dem Login war man jeweils einen Klick lang eingeloggt und danach sofort wieder ausgeloggt.
Nach etlichen erfolglosen Google-Suchen (im Nachhinein googelt es sich ganz leicht danach, aber versucht mal was dazu zu finden, nachdem Ihr nicht weiter als bis hierher gelesen habt) fand ich endlich die Ursache, nämlich die Funktion wp_unregister_GLOBALS()
in der Datei wp-settings.php
. Hier ist sie:
function wp_unregister_GLOBALS() {
if ( !ini_get('register_globals') )
return;
if ( isset($_REQUEST['GLOBALS']) )
die('GLOBALS overwrite attempt detected');
// Variables that shouldn't be unset
$noUnset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', 'table_prefix');
$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
foreach ( $input as $k => $v )
if ( !in_array($k, $noUnset) && isset($GLOBALS[$k]) ) {
$GLOBALS[$k] = NULL;
unset($GLOBALS[$k]);
}
}
Was macht diese Funktion?
- Zeile 27/28:
Wenn auf dem Webserver die PHP-Einstellungregister_globals
nicht aktiviert ist, dann macht sie überhaupt nichts (daher auch die unterschiedlichen Verhaltensweisen meines Scripts auf meinem lokalen und dem Live-Server). Istregister_globals
jedoch aktiv, geht es folgendermaßen weiter:- Zeile 34:
Wie der Kommentar schon sagt, werden hier alle globalen Variablen aufgelistet, die nicht resettet werden sollen. Wie man sieht, ist$_SESSION
nicht dabei! - Zeile 36-41:
Nun werden nacheinander alle globalen Variablen durchgegangen und gelöscht.
- Zeile 34:
Kurz gesagt: Wenn register_globals
aktiviert ist, wird $_SESSION
bei jedem Seitenaufruf gelöscht. Kein Wunder also, daß man nicht mehr an seine Session-Variablen rankommt!
Wozu das Ganze?
Nun ja, zum einen geht WordPress davon aus, daß es sich komplett um jeden Bereich der Seite kümmern soll – schließlich ist es ja eine Art von Content-Management-System. Und das beinhaltet eben auch, daß es die Verwaltung sämtlicher Variablen übernimmt.
Was aber noch viel wichtiger ist, ist die Tatsache, daß die Verwendung von register_globals
längst veraltet ist und das Feature mit PHP 6 sogar komplett entfernt wird. Von der Programmierung mit solchen Variablen wird inzwischen überall abgeraten, da sie Sicherheitsrisiken birgt. WordPress versucht also offensichtlich, das Verhalten von deaktiviertem register_globals
nachzuahmen, um die Sicherheit zu erhöhen und eventuelle Variablenkonflikte zu vermeiden.
Abhilfe
Nachdem ich erst einmal hinter dieses Rätsel gekommen war, lag die Lösung natürlich auf der Hand: Ich muß register_globals
auf dem Webserver deaktivieren, damit WordPress diese bescheuerte Funktion gar nicht erst auszuführen braucht. Dazu lädt man einfach in sein WordPress-Verzeichnis eine Textdatei namens php.ini
hoch, in der die folgende Zeile steht:
register_globals Off
Weitere Informationen zum Thema gibt es auf php.net:
73 Antworten zu “Session-Variablen in WordPress”
Hi Ginchen,
I ‚m having the same session unset issue while trying to add captcha to my form. I just follwed you php.ini step to solve the issue. But it did not solve my problem then i modified wp-settings.php file to add $_session variable to nounset array.
just this, now my site is even not loading. I’m unable to access both the admin and blog sections.
It just displays blank page, no error, nothing.
I have replaced wp-config.php and wp-setting.php files with old files. But still problem is not resolved.
My site is hosted on shared host.
Please help me.
Thanks
Priya
Well, if you recovered the original files, they won’t probably be the problem. Did you delete the not working php.ini? On some servers, php.ini files are not supported. Instead, you can sometimes set certain PHP options in the admin panel of your host.
Thanks Ginchen!
I get to feel smug for Googling this first ;-) It was actually just fluke, but I’m pretty surpised there isn’t more documentation out there on this.
Did you try using using the WP database for session stuff at all? Was thinking a script for getting and setting some custom user meta fields might work but I’ve not tried. That just ignorance on my part?
Hmm, no, I didn’t do anything with the WP database. I just wrote a login script that used the login data from a phpBB installation on the same database. But I don’t see why your idea shouldn’t work. :)
You are a saviour…..
I tried so many options…putting session_start whereever i can but couldnt get it to work consistently.
Thanks a ton….i just updated the wp-settings.php function with a return
Hehe, the radical method. ;) But this way, you have to edit
wp-settings.php
after every WordPress update. That is why I would rather try to disableregister_globals
than changing the WordPress files.Vielen Dank erstmal für die Infos. Hat mir schon weiter geholfen, bei meinem Problem mit WordPress!
Wo, ich jetzt allerdings immer noch hänge, ist eigentlich nicht dass Thema des Blogeintrags, aber du hast es in den Kommentaren erwähnt. Ich suche nach einem Login-Skript, um die phpBB3-Userdaten in meinem WordPressblog nutzen zu können. Ich binde wie auf phpbb.de beschrieben die common.php ein, erhalte jedoch auf den WordPressseiten dann immer die Fehlermeldung: „Fatal error: Call to a member function sql_query() on a non-object in /pages/48/f6/d0004241/home/htdocs/lupa_neu5/phpBB3/includes/cache.php on line 51“. Trotz intensiver Google-Suche habe ich noch nichts gefunden, was mir hilft. Habe jetzt angefangen über die phpBB-Cookies die Sitzung auszulesen und bin wegen eines anderen Problems auf deiner Seite gelandet.
Um es abzukürzen, daher meine Frage: Gibt es das von dir geschriebene Login-Skript irgendwo als Plugin oder Beispiel zum runterladen?
Also, das was ich da damals programmiert hatte, könntest Du, glaube ich, sowieso nicht brauchen. Das war für eine ganz spezielle Seite gedacht und ist damit wohl nicht wirklich wiederverwertbar. ;)
Ich nehme an, Du willst, daß Leute sich im phpBB einloggen und dann auch gleich ins WordPress-Backend rein können (oder umgekehrt: sich in WP einloggen und dann auch gleich im Forum eingeloggt sind)? Dafür habe ich inzwischen eine tolle Lösung gefunden: die WordPress to phpBB3 Bridge. Allerdings geht die im Moment nur bis WordPress-Version 2.7.1. (was ich aber eigentlich auch nicht sooo schlimm finde). Das Tolle an dieser Bridge ist, daß sie überhaupt keine große Konfiguration oder Rumgefummel benötigt – einfach wie ein Plugin installieren und fertig.
Alternativ gibt es noch WP-United. Das habe ich vor langer Zeit mal getestet, aber da gab es anscheinend noch ein paar Bugs, durch die es bei mir überhaupt nicht funktionierte und ich es wieder gelöscht habe. Aber inzwischen hat sich da ja auch wieder was getan – vielleicht also auch nochmal einen Versuch wert.
Hallo,
WP-United kenne ich, ist mir allerdings bei der Weiterentwicklung immer etwas zögerlich.
Die andere Bridge kannte ich noch nicht. Da ich aber bereits auf WordPress 2.8.x geupdatet habe, fällt die momentan aus.
Habe aber von dort aus weiter recherchiert und zwei weitere Bridges gefunden:
Onepress: http://onepresscommunity.com/
Single Sign On: http://wordpress.org/extend/plugins/phpbb-single-sign-on/
Um es kurz zu machen: Beide laufen bei mir irgendwie nicht. Aber vielleicht helfem einem anderen User die Links weiter.
Werde mir also jetzt doch noch WP-United anschauen und wenn das nicht funktioniert manuell eine Übergangslösung programmieren, bis eine der Bridges mit der neuesten WordPress und phpBB-Version funktioniert.
Thanks so much for this, it saved me a lot of time integrating a music download system I wrote a while ago with a new WordPress website / theme I have developed.
For anyone who wants to disable Register_Globals but can’t edit their php.ini, it also possible to do it by putting this line in your .htaccess file:
php_flag register_globals off