Reindirizzare i visitatori a una pagina di manutenzione temporanea


13

Per impedire ai miei visitatori di vedere una versione non funzionante del mio sito durante la manutenzione e di dare loro un avviso sugli aggiornamenti, vorrei reindirizzarli automaticamente a una pagina di manutenzione temporanea. Sto cercando una soluzione portatile che può essere utilizzata su qualsiasi sito, senza URL hardcoding.

Gli amministratori connessi (o altri livelli di scelta dell'utente) dovrebbero avere pieno accesso al back-end e al front-end. Esistono molti plugin che offrono questa funzionalità, ma sto cercando una soluzione solo per il codice.


copiare il codice da un plugin?
Mark Kaplun,

Perché reinventare la ruota? Usa un plugin. In particolare, accesso limitato al sito.
vancoder,

2
Cerco di utilizzare il minor numero possibile di plugin per il mio tema personalizzato. "Less is more";)
NewUser

Risposte:


24

WordPress ha una funzione integrata per la gestione della modalità di manutenzione.

Quando aggiorni un plug-in o il core di WordPress dalla dashboard di WP, WordPress entra in modalità di manutenzione: prova a caricare un file che si maintenance.phptrova nella cartella del contenuto (di solito /wp-content) e se quel file non è presente, WP mostra un messaggio predefinito.

Ti suggerisco di utilizzare quel file, in questo modo sarai coerente per la manutenzione attivata manualmente e per la manutenzione gestita da WordPress.

Come

  1. Prima di tutto crea il maintenance.phpfile e metti lì il contenuto che desideri. Per lo styling ti suggerisco di inserire CSS nel file stesso, usando <style>tag; generalmente questo non è un buon consiglio, ma in questo caso ti dà la possibilità di usare il file per la modalità di manutenzione gestita da WordPress, quando non viene caricato alcun tema (e il tema potrebbe essere in aggiornamento, quindi non affidabile).

  2. Salvare il file appena creato nella cartella del contenuto (di solito /wp-content).

  3. Nel tuo 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();
        }
    });
    

    Questo codice controllerà una costante (vedi punto successivo) e se l'utente non ha effettuato l'accesso, carica il file creato al punto # 1 ed esce.

    Se si desidera consentire solo agli utenti con funzionalità specifiche, utilizzare current_user_can('capability_to_allow')invece di is_user_logged_in(). Vedi Codex per maggiori informazioni.

    Forse puoi aggiungere maintenance.phpun link alla pagina di accesso; in questo modo un utente non registrato può fare clic su di esso senza dover inserire manualmente l'URL di accesso nella barra degli indirizzi.

    Se stai usando un tema sviluppato da una terza parte, usa un tema figlio ; in questo modo sarai in grado di aggiornare in sicurezza il tema senza perdere le modifiche.

  4. Quando si desidera abilitare la modalità di manutenzione, aprire wp_config.phpe inserire lì:

    define('IN_MAINTENANCE', true);

    Dopodiché, quando sei pronto a rendere di nuovo pubblico il tuo sito, rimuovi semplicemente quella linea o truepassa a falseper riattivare più facilmente.


Questa è una risposta molto dettagliata e un ottimo modo per risolvere il mio problema con il minor sforzo possibile! Lo proverò più tardi e accetterò la risposta se funziona. Grazie mille GM!
Nuovo Utente

Ciao GM, utilizzo una directory personalizzata "wp-content" ma non ho idea di come modificare WP_CONTENT_DIR ..... per farlo funzionare? migliore
NewUser

Vecchio thread, lo so ... ma nel caso in cui qualcuno abbia bisogno di quella risposta, è facile come aggiungere define('WP_CONTENT_DIR','/url/to/define/');nel tuo wp-config.phpfile.
OGM,

@gmazzap, è fantastico. Significa che se e solo se sei già registrato (ad esempio come amministratore), sarai comunque in grado di accedere e apportare modifiche a / sulla console di amministrazione?
paranza,

@paranza sì, corretto.
gmazzap

2

La risposta precedente è completa e ben scritta. Ad ogni modo, se sei come me e vuoi avere tutto in un unico posto, puoi eliminare le seguenti righe nel function.phpfile e creare un maintenance.phpfile nella directory del tema.

Ciò è particolarmente utile se il repository Git punta solo alla directory del tema.

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

APPUNTI

Ho cambiato l'intestazione in header('HTTP/1.1 503 Service Temporarily Unavailable');quanto quella sopra non ha funzionato per me.


Ne vedo il punto, ma noto un paio di cose: WordPress non utilizzerà questo file di manutenzione all'interno della directory del tema quando fa la propria manutenzione (quindi sarebbe una buona idea creare wp-content / maintenance.php come bene e quindi richiedere () il tema uno in esso); anche la definizione di costanti del genere si collocherebbe di solito nel tuo wp-config.php o come variabile d'ambiente, invece di dover attivare / disattivare la modalità di manutenzione effettuando i commit. :)
Tim Malone l'

@TimMalone, sono d'accordo. Alla fine è una soluzione alternativa che funzionerà bene in un breve periodo di tempo, mentre tu (sviluppatore) esegui tutti gli aggiornamenti.
a.barbieri l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.