Przekieruj odwiedzających na stronę tymczasowej konserwacji

13

Aby uniemożliwić odwiedzającym zobaczenie uszkodzonej wersji mojej witryny podczas konserwacji i dać im znać o aktualizacjach, chciałbym przekierować ich automatycznie na stronę tymczasowej konserwacji. Szukam przenośnego rozwiązania, które może być używane w dowolnej witrynie, bez zakodowanych adresów URL.

Zalogowani administratorzy (lub inny wybrany poziom użytkownika) powinni uzyskać pełny dostęp do zaplecza i interfejsu użytkownika. Istnieje wiele wtyczek, które oferują tę funkcjonalność, ale szukam rozwiązania tylko do kodu.

Nowy użytkownik
źródło
skopiować kod z wtyczki?
Mark Kaplun,
Po co wymyślać koło ponownie? Użyj wtyczki. W szczególności ograniczony dostęp do witryny.
vancoder
2
Staram się używać jak najmniej wtyczek dla mojego niestandardowego motywu. „Mniej znaczy więcej”;)
Nowy użytkownik

Odpowiedzi:

24

WordPress ma wbudowaną funkcję obsługi trybu konserwacji.

Po uaktualnieniu wtyczki lub rdzenia WordPress z pulpitu nawigacyjnego WP WordPress przechodzi do trybu konserwacji: próbuje załadować plik o nazwie maintenance.phpznajdującej się w folderze zawartości (zwykle /wp-content), a jeśli tego pliku nie ma, WP wyświetla komunikat domyślny.

Sugeruję użycie tego pliku, w ten sposób będziesz spójny w przypadku konserwacji uruchamianej ręcznie i obsługi obsługiwanej przez WordPress.

Jak

  1. Najpierw utwórz maintenance.phpplik i umieść tam żądaną treść. Do stylizacji sugeruję umieszczenie CSS w samym pliku, używając <style>tagu; generalnie nie jest to dobra rada, ale w tym przypadku daje możliwość użycia pliku w trybie konserwacji obsługiwanym przez WordPress, gdy nie jest załadowany żaden motyw (a motyw może być aktualizowany, więc nie jest wiarygodny).

  2. Zapisz właśnie utworzony plik w folderze zawartości (zwykle /wp-content).

  3. W twoim functions.phpzestawie:

    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();
        }
    });
    

    Ten kod sprawdzi stałą (patrz następny punkt) i jeśli użytkownik nie jest zalogowany, załaduj plik utworzony w punkcie # 1 i wyjdź.

    Jeśli chcesz zezwolić tylko użytkownikom o określonych możliwościach, użyj current_user_can('capability_to_allow')zamiast is_user_logged_in(). Aby uzyskać więcej informacji, zobacz Kodeks .

    Może możesz dodać maintenance.phplink do strony logowania; w ten sposób niezalogowany użytkownik może kliknąć go bez konieczności ręcznego wprowadzania adresu URL logowania w pasku adresu.

    Jeśli używasz motywu opracowanego przez inną firmę, użyj motywu podrzędnego ; w ten sposób będziesz mógł bezpiecznie aktualizować motyw bez utraty swoich zmian.

  4. Jeśli chcesz włączyć tryb konserwacji, otwórz wp_config.phpi umieść tam:

    define('IN_MAINTENANCE', true);

    Następnie, gdy będziesz gotowy ponownie opublikować witrynę, po prostu usuń tę linię lub zmień truena, falseaby ułatwić jej ponowne włączenie.

gmazzap
źródło
To bardzo szczegółowa odpowiedź i świetny sposób na rozwiązanie mojego problemu przy jak najmniejszym wysiłku! Spróbuję później i zaakceptuję odpowiedź, jeśli zadziała. Dziękuję bardzo GM!
Nowy użytkownik
Cześć GM - używam niestandardowego katalogu o nazwie „wp-content”, ale nie mam pojęcia, jak zmienić WP_CONTENT_DIR ..... aby działał? najlepsze
NewUser
Stary wątek, wiem .. ale tylko w przypadku, gdy ktoś potrzeba, że odpowiedź, to tak proste jak dodanie define('WP_CONTENT_DIR','/url/to/define/');w wp-config.phppliku.
gmo
@gmazzap, to jest niesamowite. Czy to oznacza, że ​​jeśli i tylko jeśli jesteś już zalogowany (powiedzmy jako administrator), nadal będziesz mógł uzyskiwać dostęp i modyfikować konsolę administracyjną?
paranza
@paranza tak, poprawne.
gmazzap
2

Poprzednia odpowiedź jest kompletna i dobrze napisana. W każdym razie, jeśli jesteś podobny do mnie i chcesz mieć wszystko w jednym miejscu, możesz upuścić następujące wiersze w function.phppliku i utworzyć maintenance.phpplik w katalogu motywów.

Jest to szczególnie przydatne, jeśli Twoje repozytorium Git wskazuje tylko katalog motywów.

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();
    }
});

UWAGI

Zmieniłem nagłówek, header('HTTP/1.1 503 Service Temporarily Unavailable');ponieważ powyższy nie działał dla mnie.

a.barbieri
źródło
Widzę sens tego, ale zwróć uwagę na kilka rzeczy - WordPress nie użyje tego pliku konserwacji w katalogu motywu podczas wykonywania własnej konserwacji (więc dobrym pomysłem byłoby utworzenie wp-content / Maintenance.php jako cóż, a następnie wymagają () jeden motyw do niego); także definiowanie takich stałych zwykle będzie znajdować się w twoim pliku wp-config.php lub jako zmienna środowiskowa, zamiast konieczności zarządzania włączaniem / wyłączaniem trybu konserwacji poprzez zatwierdzanie zmian. :)
Tim Malone
@TimMalone, zgadzam się. Na koniec jest to obejście, które będzie działać dobrze przez krótki czas, podczas gdy Ty (programista) dokonasz wszystkich aktualizacji.
a.barbieri,