Redireccionar visitantes a una página de mantenimiento temporal

13

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

Los administradores que hayan iniciado sesión (u otro nivel de usuario de elección) deben tener acceso completo al back-end y al front-end. Hay muchos complementos que ofrecen esta funcionalidad, pero estoy buscando una solución de solo código.

Nuevo Usuario
fuente
copiar el código de un complemento?
Mark Kaplun
¿Por qué reinventar la rueda? Usa un complemento. Específicamente, acceso restringido al sitio.
vancoder
2
Intento utilizar la menor cantidad de complementos posible para mi tema personalizado. "Menos es más";)
Usuario nuevo

Respuestas:

24

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

Cuando actualiza un complemento, o el núcleo de WordPress desde el panel de WP, WordPress ingresa al modo de mantenimiento: intenta cargar un archivo llamado maintenance.phpubicado 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á consistente para su mantenimiento activado manualmente y para el mantenimiento manejado por WordPress.

Cómo

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

  2. Guarde el archivo recién creado en la carpeta de contenido (generalmente /wp-content).

  3. En tu functions.phppuesto:

    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 (vea el siguiente punto) y si el usuario no está conectado, cargue el archivo creado en el punto # 1 y salga.

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

    Tal vez pueda agregar a maintenance.phpun 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 de forma segura el tema sin perder los cambios.

  4. Cuando desee habilitar el modo de mantenimiento, abra su wp_config.phpy coloque allí:

    define('IN_MAINTENANCE', true);

    Después de eso, cuando esté listo para hacer su sitio de nuevo público, basta con retirar esa línea o el cambio truea falsede más fácil volver a habilitar.

gmazzap
fuente
¡Esta es una respuesta muy detallada y una excelente manera de resolver mi problema con el menor esfuerzo posible! Lo intentaré más tarde y aceptaré la respuesta si funciona. Muchas gracias GM!
Usuario nuevo
Hola, GM: utilizo un directorio personalizado llamado "contenido de wp", pero no tengo idea de cómo cambiar el WP_CONTENT_DIR ..... para que funcione. best
NewUser
Hilo antiguo, lo sé ... pero en caso de que alguien necesite esa respuesta, es tan fácil como agregar define('WP_CONTENT_DIR','/url/to/define/');su wp-config.phparchivo.
OMG
@gmazzap, esto es asombroso. ¿Significa que si y solo si ya ha iniciado sesión (por ejemplo, como administrador), aún podrá acceder y realizar modificaciones en / en la consola de administración?
paranza
@paranza sí, correcto.
gmazzap
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 function.phparchivo y crear un maintenance.phparchivo 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');como el anterior no funcionó para mí.

a.barbieri
fuente
Puedo ver el punto de esto, pero tenga en cuenta un par de cosas: WordPress no usará este archivo de mantenimiento dentro del directorio de temas cuando realice su propio mantenimiento (por lo que sería una buena idea crear wp-content / maintenance.php como bien y luego requiere () su tema uno en él); también definir constantes como esa normalmente se ubicaría en su wp-config.php o como una variable de entorno, en lugar de tener que administrar el modo de mantenimiento activado / desactivado mediante confirmaciones. :)
Tim Malone
@TimMalone, estoy de acuerdo. Al final, es una solución alternativa que funcionará bien en un corto período de tiempo, mientras que usted (desarrollador) realiza todas las actualizaciones.
a.barbieri