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

11

Para evitar que meus visitantes vejam uma versão corrompida do meu site durante a manutenção, e para que eles fiquem atentos às 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 codificar URLs.

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

    
por NewUser 26.11.2014 / 14:37

2 respostas

21

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

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

Eu sugiro que você use esse arquivo, desta forma você será consistente para sua manutenção disparada manualmente e para manutenção manipulada pelo WordPress.

Como

  1. Primeiro, crie o arquivo maintenance.php e coloque o conteúdo desejado. Para o estilo, sugiro que você coloque CSS no próprio arquivo, usando <style> tag; geralmente isso não é um bom conselho, mas, nesse caso, é possível usar o arquivo para o modo de manutenção manipulado pelo WordPress, quando nenhum tema é carregado (e o tema pode estar sendo atualizado, portanto, não é confiável).

  2. Salve o arquivo que acabou de criar na pasta de conteúdo (geralmente /wp-content ).

  3. No seu functions.php put:

    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 (veja o próximo ponto) e se o usuário não estiver logado, carregue o arquivo criado no ponto # 1 e saia.

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

    Talvez você possa adicionar ao maintenance.php um link para a página de login. desta 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 infantil ; Dessa forma, você poderá atualizar o tema com segurança sem perder suas alterações.

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

    define('IN_MAINTENANCE', true);
    

    Depois disso, quando você estiver pronto para tornar seu site público novamente, basta remover essa linha ou alterar true para false para facilitar a reativação.

por gmazzap 26.11.2014 / 16:05
2

A resposta anterior está completa e bem escrita. De qualquer forma, se você é como eu e quer ter tudo em um só lugar, pode soltar as seguintes linhas no arquivo function.php e criar um arquivo maintenance.php no diretório do seu tema.

Isso é especialmente útil se 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

Alterei o cabeçalho para header('HTTP/1.1 503 Service Temporarily Unavailable'); , pois o acima não funcionou para mim.

    
por a.barbieri 10.03.2017 / 16:52