¿Cómo usar un archivo maintenance.php dentro de un tema de WordPress?

5 minutos de lectura

Avatar de usuario de ProxxiM
ProxxiM

Me preguntaba si alguien sabe una forma de usar un archivo maintenance.php dentro de su tema de WordPress, en lugar del que está en la carpeta wp-content.

Principalmente estoy buscando algún código para el archivo functions.php que llamaría al archivo maintenance.php en la carpeta del tema.

Nos gustaría agregar algo de marca a la página de mantenimiento y, por lo tanto, sería mejor poder usarlo desde dentro de la carpeta del tema. Sé que hay complementos especiales para esto. Pero no queremos dar a nuestros sitios demasiados gastos generales con los complementos que solo se usan para pequeños detalles como este, por lo que si hay una manera de lograr esto a través de la carpeta de temas, ¡sería genial!

Cuando WordPress entra en modo de mantenimiento, agrega un archivo llamado .maintenance al directorio raíz mientras se realiza el mantenimiento, luego se elimina después. Puedes escribir una función dentro de tu tema functions.php que busca este archivo y carga una página de mantenimiento personalizada desde el tema.

if ( ! function_exists( 'wpse84987_maintenance_mode' ) ) {
    function wpse84987_maintenance_mode() {
        if ( file_exists( ABSPATH . '.maintenance' ) ) {
            include_once get_stylesheet_directory() . '/maintenance.php';
            die();
        }
    }
    add_action( 'wp', 'wpse84987_maintenance_mode' );
}

Ponga su contenido de mantenimiento en el maintenance.php página dentro de la carpeta de su tema y ya está todo listo para darle el estilo que desee.

Si usas el wp_die función, obtendrá el cuadro blanco estándar sobre fondo gris. De esta manera, puede diseñar su página de mantenimiento como lo haría con cualquier otra página de tema.

También puede hacer esto fuera del tema agregando maintenance.php hacia wp-content directorio (o donde haya configurado WP_CONTENT_DIR para apuntar a) como un complemento directo. Cuando WP verifica el modo de mantenimiento desde adentro wp_maintenance() buscará ese archivo y lo cargará si está presente, o cargará el suyo propio si no lo está. Si el sitio no está en modo de mantenimiento, o está en él durante más de 10 minutos, ‘maintenance.php’ no se cargará aunque técnicamente el sitio aún esté en modo de mantenimiento. WordPress 4.6 introduce el 'enable_maintenance_mode' filter, que puede ser (ab)utilizado por una herramienta como wp-cli para forzar la verificación del acceso directo y le permitiría ejecutar un comando CLI desde su archivo de mantenimiento.

  • Extraño. Encontré exactamente el mismo código ayer, pero no conseguí que funcionara en ese momento. Ahora funciona según lo previsto, ¡carga el archivo maintenance.php en el tema! ¡Gracias!

    – ProxxiM

    2 de agosto de 2017 a las 7:02

  • Aunque esto cargará el archivo, he notado que usar funciones de wordpress como get_header() dará como resultado un mensaje de función indefinida al ver la página. ¿Cómo se puede resolver esto para que la página se pueda construir como un archivo page.php dentro del tema?

    – Lee

    4 de septiembre de 2018 a las 8:19

Avatar de usuario de Roko C. Buljan
Roko C. Bulján

Cambiar WordPress Modo de mantenimiento

Lo que crearemos:

  • Usuario – mostrar la página “En mantenimiento”
  • Administración – capaz de ver todo el sitio web
  • Agregue una opción al panel Configuración – General para activar/desactivar el modo de mantenimiento

Primero, crea un maintenance.php archivo en la raíz de su tema:

<!DOCTYPE html>
<html <?php language_attributes(); ?>>

<head>
    <meta charset="<?php bloginfo('charset'); ?>">
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <?php wp_head(); ?>
</head>

<body class="page-maintenance">

    <img src="<?= get_template_directory_uri() . '/assets/img/logo.png'; ?>" alt="<?= get_bloginfo('name') ?>">
    <p><?= get_bloginfo('description') ?></p>
    <h1>Under maintenance</h1>
    <p><b>We'll be back soon!</b></p>

    <?php wp_footer(); ?>
</body>
</html>

añadir functions.php:

/** 
 * Under Maintenance
 */

// Add options checkbox to Settings / General 
function mythemename_settings_general_maintenance()
{
    add_settings_section(
        'my_settings_section', // Section ID 
        'ADDITIONAL SETTINGS', // Section Title
        'my_section_options_callback', // Content Callback
        'general' // Show under "General" settings page
    );
    add_settings_field(
        'maintenance_mode', // Option ID
        'Maintenance mode', // Option Label
        'maintenance_mode_callback', // Callback for Arguments 
        'general', // Show under "General" settings page
        'my_settings_section', // Name of the section
        array( // The $args to pass to the callback
            'maintenance_mode' // Should match Option ID
        )
    );
    register_setting('general', 'maintenance_mode', 'esc_attr');
}
function my_section_options_callback()
{
    // Custom Section Callback content
    echo "Custom theme options";
}
function maintenance_mode_callback($args)
{
    // Checkbox Callback
    $value = get_option($args[0]);
    $checked = ($value == "on") ? "checked" : "";
    echo "<label>
      <input type=\"checkbox\" id=\"$args[0]\" name=\"$args[0]\" $checked />
      <span>Check to activate Maintenance Mode page</span>
    </label><p>A general <i>Under Maintenance</i> page will be shown to non-admin users.</p>";
}
add_action('admin_init', 'mythemename_settings_general_maintenance');

// Handle Maintenance page
if (!function_exists('wp_under_maintenance')) :
    function wp_under_maintenance()
    {
        $isLoginPage = basename($_SERVER['PHP_SELF']) == 'wp-login.php';
        $isMaintenanceModeOn = get_option('maintenance_mode') == "on";

        if (
            $isMaintenanceModeOn &&
            !$isLoginPage &&
            !is_user_logged_in() &&
            !is_admin() &&
            !current_user_can("update_plugins")
        ) {
            get_template_part('maintenance');
            exit();
        }
    }
endif;
add_action('init', 'wp_under_maintenance', 30);

Ahora ve a tu panel de administración, Configuración, General y encontrarás:

ingrese la descripción de la imagen aquí

¿Ha sido útil esta solución?