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”
Thanks very much for the info!
Nice site by the way.
I am here for the first time but have bookmarked it.
I love you, I have been working on this problem the entire day before I came across your site. You are a life saver!
I tried all this solutions, but still not working for me.
Please anybody help me, its really urgent.
I am using session for HotelID, based on which I am getting all the information in the pages from mssql database which I have connected with this wordpress site.
Any help would be appreciated.
Thanks,
Arpita
Did you put
session_start()
in yourwp-config.php
?Great job, thank you very much!!! I was becoming crazy with vars SESSION legacy, from the web pages to the intern web blog. Luckily, I find this post before spend all the day ;DDD
Great post! I feel obligated to write something to thank you for sharing this information.
:D
No problem, man! ;)
I’m experiencing a similar problem with WordPress and was hoping that you may be able to offer some insight.
In my header.php
—
session_start();
print_r($_SESSION);
global $myVar;
$myVar = time();
—
In my footer.php
—
global $myVar;
$_SESSION[‚key‘] = $myVar;
print_r($_SESSION);
—
When I do this, the output in the footer shows me that the the session variable ‚key‘ was correctly set to my new time value (myVar). However, when I reload the page, the header output will show that the same session variable ‚key‘ is now 2-5 seconds faster than it should be. It is like the header is being called again after the page has loaded.
It’s Crazy!
Try out:
if ( !session_id() )
add_action( ‚init‘, ’session_start‘ );
As already mentioned before, I was assuming in my post that everybody has naturally added „session_start()“ to his code somewhere. But your version is very nice and clean, I will keep it in mind for the future! :)