it-swarm.com.de

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

Um zu verhindern, dass meine Besucher während der Wartung eine fehlerhafte Version meiner Website sehen, und um sie über die Aktualisierungen 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 Site verwendet werden kann, ohne URLs fest zu codieren.

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.

12
NewUser

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

Wenn Sie ein Plugin oder einen WordPress-Core von WP Dashboard aktualisieren, wechselt WordPress in den Wartungsmodus: Es wird versucht, eine Datei mit dem Namen maintenance.php zu laden, die sich im Inhaltsordner befindet (normalerweise /wp-content). Wenn diese Datei nicht vorhanden ist, WP zeigt 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 Datei maintenance.php und platzieren Sie dort den gewünschten Inhalt. Zum Stylen schlage ich vor, dass Sie CSS mit dem Tag <style> 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 im Inhaltsordner (normalerweise /wp-content).

  3. Tragen Sie in Ihren functions.php ein:

    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') anstelle von is_user_logged_in(). Siehe Codex für weitere Informationen.

    Möglicherweise können Sie zu maintenance.php einen 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.php und 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 ändern Sie true in false, um die erneute Aktivierung zu erleichtern.

24
gmazzap

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 die function.php -Datei einfügen und eine maintenance.php -Datei 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 header('HTTP/1.1 503 Service Temporarily Unavailable'); geändert, da der oben genannte bei mir nicht funktioniert hat.

2
a.barbieri