Redirecionar visitantes para uma página de manutenção temporária

13

Para impedir que meus visitantes vejam uma versão corrompida do meu site durante a manutenção e para avisar sobre as atualizações, eu gostaria de redirecioná-los automaticamente para uma página de manutenção temporária. Estou procurando uma solução portátil que possa ser usada em qualquer site, sem URLs codificados.

Os administradores conectados (ou outro nível de usuário preferido) devem ter acesso total ao back-end e ao front-end. Existem muitos plugins por aí que oferecem essa funcionalidade, mas estou procurando uma solução apenas de código.

Novo usuário
fonte
copiar o código de um plugin?
Mark Kaplun
Por que reinventar a roda? Use um plugin. Especificamente, acesso restrito ao site.
vancoder
2
Eu tento usar o mínimo possível de plugins para o meu tema personalizado. "Menos é mais";)
NewUser 26/11

Respostas:

24

O WordPress possui um recurso incorporado para lidar com o modo de manutenção.

Quando você atualiza um plugin ou núcleo do WordPress a partir do painel do WP, o WordPress entra no modo de manutenção: ele tenta carregar um arquivo nomeado maintenance.phplocalizado na pasta de conteúdo (geralmente /wp-content) e, se esse arquivo não estiver lá, o WP mostra uma mensagem padrão.

Eu sugiro que você use esse arquivo, assim você será consistente para a manutenção acionada manualmente e para a manutenção manipulada pelo WordPress.

Como

  1. Primeiro, crie o maintenance.phparquivo e coloque lá o conteúdo que você deseja. Para estilizar, sugiro que você coloque CSS no próprio arquivo, usando <style>tag; Geralmente, esse não é um bom conselho, mas, nesse caso, oferece a capacidade de usar o arquivo no modo de manutenção gerenciada pelo WordPress, quando nenhum tema é carregado (e o tema pode estar sendo atualizado, portanto, não é confiável).

  2. Salve o arquivo recém-criado na pasta de conteúdo (normalmente /wp-content).

  3. Em seu 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();
        }
    });

    Este código verificará uma constante (consulte o próximo ponto) e, se o usuário não estiver logado, carregue o arquivo criado no ponto 1 e saia.

    Se você deseja permitir apenas usuários com recursos específicos, use em current_user_can('capability_to_allow')vez de is_user_logged_in(). Veja Codex para mais informações.

    Talvez você possa adicionar a maintenance.php um link à página de login; dessa forma, um usuário não logado pode clicar nele sem ter que inserir manualmente o URL de login na barra de endereço.

    Se você estiver usando um tema desenvolvido por terceiros, use um tema filho ; Dessa forma, você poderá atualizar o tema com segurança sem perder suas alterações.

  4. Quando você deseja ativar o modo de manutenção, abra o seu wp_config.phpe coloque lá:

    define('IN_MAINTENANCE', true);

    Depois disso, quando você está pronto para fazer o seu site público novamente, basta remover essa linha ou mudança truepara falsea fácil re-habilitação.

gmazzap
fonte
Esta é uma resposta muito detalhada e uma ótima maneira de resolver meu problema com o menor esforço possível! Vou tentar mais tarde e aceitar a resposta, se funcionar. Muito obrigado GM!
NewUser
Oi GM - Eu uso um diretório chamado "wp-content" personalizado, mas não tenho idéia de como alterar o WP_CONTENT_DIR ..... para fazê-lo funcionar? best
NewUser 30/11/14
Tópico antigo, eu sei .. mas, caso alguém precise dessa resposta, é tão fácil quanto adicionar define('WP_CONTENT_DIR','/url/to/define/');seu wp-config.phparquivo.
Gmo #
@gmazzap, isso é incrível. Isso significa que, se e somente se você já estiver conectado (digamos, como administrador), ainda poderá acessar e fazer modificações no / no console de administração?
paranza
@ paranza sim, correto.
gmazzap
2

A resposta anterior está completa e bem escrita. De qualquer forma, se você é como eu e deseja ter tudo em um só lugar, pode soltar as seguintes linhas no function.phparquivo e criar ummaintenance.php arquivo no diretório de temas.

Isso é especialmente útil se o seu repositório Git apontar apenas para o diretório do 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();
    }
});

NOTAS

Mudei o cabeçalho para header('HTTP/1.1 503 Service Temporarily Unavailable');o que estava acima não funcionou para mim.

a.barbieri
fonte
Eu posso entender o ponto disso, mas observe algumas coisas - o WordPress não usará esse arquivo de manutenção dentro do diretório do tema ao fazer sua própria manutenção (portanto, seria uma boa idéia criar wp-content / maintenance.php como bem e, em seguida, exigir () o seu tema nele); também definir constantes como essa geralmente fica no seu wp-config.php ou como uma variável de ambiente, em vez de ter que gerenciar o modo de manutenção sendo ativado / desativado fazendo commits. :)
Tim Malone
@ TimMalone, eu concordo. No final, é uma solução alternativa que funcionará bem em um curto período de tempo, enquanto você (desenvolvedor) faz todas as atualizações.
precisa saber é o seguinte