Wenn man Updates in WordPress durchführt (von Core, Themes oder Plugins) wird WordPress in einen Wartungsmodus (Maintenance Mode) versetzt, um Seiteneffekte zu verhindern. Und dieser Wartungsmodus ist überraschend funktionsreich.
Wie der Wartungsmodus funktioniert
Wenn ein Update durchgeführt wird, dann werden Dateien getauscht und gegebenenfalls auch Änderungen an der Datenbank durchgeführt. Damit es bei solch tiefgreifenden Anpassungen am System nicht zu unangenehmen Seiteneffekten kommt, wird in der Zeit des Updates die WordPress-Instanz lahmgelegt. Im sogenannten Wartungsmodus wird nur eine Meldung angezeigt, dass die Website gerade nicht verfügbar ist.
Damit WordPress in diesem Modus versetzt wird, genügt es, eine Datei mit Namen „.maintenance“ ins WordPress-Verzeichnis zu legen. Bei einem Update erzeugt WordPress diese Datei automatisch. In dieser Datei ist ein kurzes PHP-Statement, welches einer Variablen $upgrading einen Timestamp zuweist, also einen Wert, der dem Zeitpunkt entspricht, an dem das Update gestartet wurde.
<?php $upgrading = 1234567890; ?>
Sobald diese Datei existiert, genauer wenn die entsprechende Variable definiert ist, wird die Website in den Wartungsmodus versetzt. Dieser gilt für die Website selbst und auch für das Admin-Backend.
Ist das Update fertig, wird die Datei automatisch wieder gelöscht und der Wartungsmodus beendet. Im Regelfall ist der Wartungsmodus also nur wenige Augenblicke aktiv.
Wartungsmodus nach Fehler deaktivieren
Manchmal kommt es vor, dass ein Update hängen bleibt. Dann erscheint nur noch die Wartungsmeldung und sowohl Besucher als auch man selbst hat keinen Zugriff mehr auf die Website.
Die gute Nachricht vorne weg: Der Wartungsmodus bleibt maximal 10 Minuten aktiv. Ist der Timestamp, der in der .maintenance-Datei definiert wird, älter als 10 Minuten, wird der Wartungsmodus automatisch deaktiviert. Die Datei selbst bleibt aber erhalten.
Wer schneller wieder Zugriff haben möchte, kann per FTP einfach die .maintenance-Datei aus dem Hauptverzeichnis der Website löschen.
Wartungsmeldung schön gestalten
Die Standard-Wartungsmeldung ist nicht sonderlich hübsch (siehe oben). Aber auch dafür gibt es Abhilfe. Es ist möglich, eine Datei namens maintenance.php im wp-content-Verzeichnis anzulegen. Ist diese Datei während der Wartung vorhanden, wird ihr Inhalt automatisch statt der Standardmeldung angezeigt.
Die Seite kann beliebiges HTML und PHP enthalten und natürlich auch externe Dateien wie Grafiken oder Stylesheets laden. Da WordPress gerade in einem undefinierten Zustand ist, sollte man keine WordPress-Funktionen inkludieren und nutzen.
Hilfreich ist es, die Seite mit einem korrekten HTTP-Code auszuliefern, in diesem Fall mit dem Status „503 Service unavailable“. Dazu sollte der Beginn der Datei folgendermaßen aussehen:
<?php $protocol = $_SERVER['SERVER_PROTOCOL']; if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol ) { $protocol = 'HTTP/1.0'; } header( "$protocol 503 Service Unavailable", true, 503 ); header( 'Content-Type: text/html; charset=utf-8' ); header( 'Retry-After: 600' ); ?><!DOCTYPE html> ...
Da die Datei in wp-content/ liegt, ist sie theme- und plugin-unabhängig und bleibt auch beim Austausch der Core-Dateien erhalten.
Wartungsmodus dauerhaft nutzen
Auch in der .maintenance steht PHP-Code, der zur Ausführunsgzeit per include() geladen wird. Somit ist es möglich, der Datei auch anderen (weiteren) Code mitzugeben, als den oben genannten Zeitstempel.
Über diesen Weg ist es möglich, den Wartungsmodus auch für eigene Zwecke zu nutzen. Legt man manuell eine .maintenance-Datei an, kann man so den Wartungsmodus auch ohne laufendes Update auslösen. Allerdings hätte man nur 10 Minuten etwas davon. Um diese Beschränkung zu umgehen, kann man den Wert der $upgrading-Variablen anpassen:
<?php $upgrading = time(); ?>
Damit enthält die Variable immer den aktuellen Zeitstempel und wird somit niemals „zu alt“.
Ein zweites Problem besteht darin, dass der Wartungsmodus auch für das Admin-Backend gilt. Schlaue Köpfe haben dazu den Code der .maintenance-Datei aufgebohrt, um das Admin-Backend auszuschließen. In einem Gist gibt es dazu Beispielcode.
Diese Lösung könnte eigentlich die bekannten Maintenance-Plugins ersetzen. Ein Problem bleibt aber: wird während eines aktuell aktivierten Wartungsmodus ein Update durchgeführt, dann löscht der Update-Prozess an seinem Ende die .maintenance-Datei und beendet damit auch den manuellen Wartungsmodus.
Für eine längere Wartung oder die Anpassung einer Seite, die ohne Einblicke der Öffentlichkeit geschehen sollen, ist diese Lösung also vermutlich keine sinnvolle Option.
Suuper Danke, das hat mir sehr geholfen!