Redirigir a los visitantes a una página de mantenimiento temporal

11

Para evitar que mis visitantes vean una versión rota de mi sitio durante el mantenimiento, y para informarles sobre las actualizaciones, me gustaría redirigirlos automáticamente a una página de mantenimiento temporal. Estoy buscando una solución portátil que pueda usarse en cualquier sitio, sin URL de codificación.

Los administradores registrados (u otro nivel de elección del usuario) deben obtener acceso total al back-end y al front-end. Hay una gran cantidad de complementos que ofrecen esta funcionalidad, pero estoy buscando una solución de código solamente.

    
pregunta NewUser 26.11.2014 - 14:37

2 respuestas

21

WordPress tiene una función incorporada para manejar el modo de mantenimiento.

Cuando actualiza un complemento o el núcleo de WordPress desde el panel de control de WP, WordPress ingresa en el modo de mantenimiento: intenta cargar un archivo llamado maintenance.php ubicado en la carpeta de contenido (generalmente /wp-content ), y si ese archivo no está allí , WP muestra un mensaje predeterminado.

Le sugiero que use ese archivo, de esta manera será coherente con el mantenimiento activado manualmente y con el mantenimiento manejado por WordPress.

Cómo hacer

  1. En primer lugar, cree el archivo maintenance.php y ponga allí el contenido que desee. Para el estilo, te sugiero que pongas CSS en el archivo, usando la etiqueta <style> ; en general, no es un buen consejo, pero en este caso le brinda la posibilidad de usar el archivo para el modo de mantenimiento manejado por WordPress, cuando no se carga ningún tema (y el tema puede actualizarse, por lo que no es confiable).

  2. Guarda el archivo que se acaba de crear en la carpeta de contenido (generalmente /wp-content ).

  3. En tu 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á una constante (ver el siguiente punto) y si el usuario no ha iniciado sesión, cargará el archivo creado en el punto # 1 y saldrá.

    Si desea permitir solo a usuarios con capacidades específicas, use current_user_can('capability_to_allow') en lugar de is_user_logged_in() . Consulte Codex para obtener más información.

    Tal vez pueda agregar a maintenance.php un enlace a la página de inicio de sesión; De esta manera, un usuario no registrado puede hacer clic en él sin tener que ingresar manualmente la URL de inicio de sesión en la barra de direcciones.

    Si está utilizando un tema desarrollado por un tercero, use un tema secundario ; De esta forma, podrá actualizar el tema de forma segura sin perder sus cambios.

  4. Cuando desee habilitar el modo de mantenimiento, abra su wp_config.php y colóquelo allí:

    define('IN_MAINTENANCE', true);
    

    Después de eso, cuando esté listo para volver a hacer público su sitio, simplemente elimine esa línea o cambie de true a false para volver a habilitarlo más fácilmente.

respondido por el gmazzap 26.11.2014 - 16:05
2

La respuesta anterior está completa y bien escrita. De todos modos, si eres como yo y quieres tener todo en un solo lugar, puedes colocar las siguientes líneas en el archivo function.php y crear un archivo maintenance.php en tu directorio de temas.

Esto es especialmente útil si su repositorio de Git apunta solo al directorio 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();
    }
});

NOTAS

Cambié el encabezado a header('HTTP/1.1 503 Service Temporarily Unavailable'); porque el anterior no me funcionó.

    
respondido por el a.barbieri 10.03.2017 - 16:52

Lea otras preguntas en las etiquetas