Leiten Sie Besucher auf eine Seite für vorübergehende Wartung um


13

Um zu verhindern, dass meine Besucher während der Wartung eine fehlerhafte Version meiner Website sehen, und um sie über die Updates auf dem Laufenden zu halten, möchte ich sie automatisch auf eine temporäre Wartungsseite umleiten. Ich bin auf der Suche nach einer portablen Lösung, die auf jeder Website verwendet werden kann, ohne dass URLs hartcodiert werden müssen.

Angemeldete Administratoren (oder andere Benutzer der Wahl) sollten vollen Zugriff auf das Back-End und das Front-End erhalten. Es gibt viele Plugins, die diese Funktionalität bieten, aber ich suche nach einer Nur-Code-Lösung.


den Code von einem Plugin kopieren?
Mark Kaplun

Warum das Rad neu erfinden? Benutze ein Plugin. Insbesondere eingeschränkter Site-Zugriff.
Vancoder

2
Ich versuche so wenig Plugins wie möglich für mein benutzerdefiniertes Thema zu verwenden. "Weniger ist mehr";)
NewUser

Antworten:


24

WordPress verfügt über eine eingebettete Funktion zur Verwaltung des Wartungsmodus.

Wenn Sie ein Plugin oder einen WordPress-Core vom WP-Dashboard aus aktualisieren, wechselt WordPress in den Wartungsmodus: Es wird versucht, eine Datei mit dem Namen maintenance.phpim Inhaltsordner (normalerweise /wp-content) zu laden. Wenn diese Datei nicht vorhanden ist, zeigt WP eine Standardnachricht an.

Ich schlage vor, dass Sie diese Datei verwenden. Auf diese Weise sind Sie für Ihre manuell ausgelöste Wartung und für die von WordPress gehandhabte Wartung konsistent.

Wie man

  1. Erstellen Sie zunächst die maintenance.phpDatei und fügen Sie dort den gewünschten Inhalt ein. Zum Stylen schlage ich vor, dass Sie CSS mit <style>tag in die Datei selbst einfügen. Im Allgemeinen ist dies kein guter Rat, aber in diesem Fall haben Sie die Möglichkeit, die Datei für den von WordPress gehandhabten Wartungsmodus zu verwenden, wenn kein Design geladen ist (und das Design möglicherweise aktualisiert wird, also nicht zuverlässig).

  2. Speichern Sie die soeben erstellte Datei (normalerweise /wp-content) im Inhaltsordner .

  3. In Ihrem functions.phpPut:

    add_action( 'wp_loaded', function() {
        global $pagenow;
        if(
            defined( 'IN_MAINTENANCE' )
            && IN_MAINTENANCE
            && $pagenow !== 'wp-login.php'
            && ! is_user_logged_in()
        ) {
            header( 'HTTP/1.1 Service Unavailable', true, 503 );
            header( 'Content-Type: text/html; charset=utf-8' );
            header( 'Retry-After: 3600' );
            if ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) {
                require_once( WP_CONTENT_DIR . '/maintenance.php' );
            }
            die();
        }
    });

    Dieser Code überprüft eine Konstante (siehe nächster Punkt). Wenn der Benutzer nicht angemeldet ist, laden Sie die an Punkt 1 erstellte Datei und beenden Sie sie.

    Wenn Sie nur Benutzer mit bestimmten Funktionen zulassen möchten, verwenden Sie current_user_can('capability_to_allow')statt is_user_logged_in(). Weitere Informationen finden Sie im Codex .

    Möglicherweise können Sie maintenance.phpeinen Link zur Anmeldeseite hinzufügen . Auf diese Weise kann ein nicht angemeldeter Benutzer darauf klicken, ohne die Anmelde-URL manuell in die Adressleiste eingeben zu müssen.

    Wenn Sie ein Thema verwenden, das von einem Drittanbieter entwickelt wurde, verwenden Sie ein untergeordnetes Thema . Auf diese Weise können Sie das Thema sicher aktualisieren, ohne Ihre Änderungen zu verlieren.

  4. Wenn Sie den Wartungsmodus aktivieren möchten, öffnen Sie Ihren wp_config.phpund geben Sie dort Folgendes ein:

    define('IN_MAINTENANCE', true);

    Wenn Sie dann bereit sind, Ihre Site wieder öffentlich zu machen, entfernen Sie einfach diese Zeile oder wechseln Sie truezu, falseum die erneute Aktivierung zu vereinfachen.


Dies ist eine sehr detaillierte Antwort und eine großartige Möglichkeit, mein Problem mit möglichst wenig Aufwand zu lösen! Ich werde es später versuchen und die Antwort akzeptieren, wenn es funktioniert. Vielen Dank GM!
NewUser

Hallo GM, ich verwende ein benutzerdefiniertes Verzeichnis mit dem Namen "wp-content", aber ich habe keine Ahnung, wie ich WP_CONTENT_DIR ändern soll, damit es funktioniert. best
NewUser

Alter Thread, ich weiß .. aber nur für den Fall, dass jemand diese Antwort braucht, ist es so einfach wie das Hinzufügen define('WP_CONTENT_DIR','/url/to/define/');in Ihre wp-config.phpDatei.
GVO

@gmazzap, das ist unglaublich. Bedeutet dies, dass Sie nur dann auf die Administratorkonsole zugreifen und Änderungen daran vornehmen können, wenn Sie bereits angemeldet sind (z. B. als Administrator)?
Paranza

@paranza ja, richtig.
gmazzap

2

Die vorherige Antwort ist vollständig und gut geschrieben. Wie auch immer, wenn Sie wie ich sind und alles an einem Ort haben möchten, können Sie die folgenden Zeilen in der function.phpDatei ablegen und eine maintenance.phpDatei in Ihrem Themenverzeichnis erstellen .

Dies ist besonders nützlich, wenn Ihr Git-Repository nur auf das Themenverzeichnis verweist.

add_action( 'wp_loaded', function() 
{
    global $pagenow;

    // - - - - - - - - - - - - - - - - - - - - - - 
    // Turn on/off you Maintenance Mode (true/false)
    define('IN_MAINTENANCE', true);
    // - - - - - - - - - - - - - - - - - - - - - - 

    if(
        defined( 'IN_MAINTENANCE' )
        && IN_MAINTENANCE
        && $pagenow !== 'wp-login.php'
        && ! is_user_logged_in()
    ) {
        header('HTTP/1.1 503 Service Temporarily Unavailable');
        header( 'Content-Type: text/html; charset=utf-8' );
        if ( file_exists( get_template_directory() . '/maintenance.php' ) ) {
            require_once( get_template_directory() . '/maintenance.php' );
        }
        die();
    }
});

ANMERKUNGEN

Ich habe den Header in geändert, header('HTTP/1.1 503 Service Temporarily Unavailable');da der oben genannte bei mir nicht funktioniert hat.


Ich kann den Grund dafür sehen, aber beachte ein paar Dinge - WordPress verwendet diese Wartungsdatei nicht im Theme-Verzeichnis, wenn es seine eigene Wartung durchführt (daher wäre es eine gute Idee, wp-content / maintenance.php als zu erstellen gut und dann fordere () dein Thema an (); Das Definieren solcher Konstanten erfolgt normalerweise in der Datei wp-config.php oder als Umgebungsvariable, anstatt den Wartungsmodus durch Festschreiben ein- und ausschalten zu müssen. :)
Tim Malone

@ TimMalone, ich bin damit einverstanden. Am Ende ist es eine Problemumgehung, die in kurzer Zeit gut funktioniert, während Sie (Entwickler) alle Aktualisierungen vornehmen.
a.barbieri
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.