Publicado originalmente en 2014. Revisado y actualizado para las versiones actuales de WordPress.
Crear una página de mantenimiento o «en construcción» directamente en tu tema de WordPress es la forma más limpia de hacerlo. Evitas dependencias, controlas exactamente el HTML que se sirve y puedes devolver un código de estado HTTP 503 que informa a los buscadores que se trata de un mantenimiento temporal.
Por qué hacerlo sin plugins
La mayoría de plugins de mantenimiento añaden carga innecesaria, inyectan CSS propio y a veces devuelven código 200 en vez de 503. Con unas pocas líneas en tu functions.php y una plantilla tienes el control total.
Preparar la plantilla
Crea un archivo llamado maintenance.php dentro de la carpeta de tu tema. Este será el diseño que verán los visitantes mientras el sitio está en mantenimiento.
<?php
/*
Template Name: Maintenance
*/
?>
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo('charset'); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>En mantenimiento</title>
<style>
body { font-family: system-ui, sans-serif; text-align: center; padding: 80px 20px; background: #f8f9fa; color: #333; }
h1 { font-size: 2.8rem; margin-bottom: 20px; }
p { font-size: 1.2rem; max-width: 600px; margin: 0 auto 40px; }
</style>
</head>
<body>
<h1>Estamos en mantenimiento</h1>
<p>Volvemos en unas horas. Gracias por tu paciencia.</p>
</body>
</html>El hook template_redirect
Este hook se ejecuta justo antes de que WordPress decida qué plantilla cargar. Es el lugar perfecto para interceptar la petición y decidir si mostrar la página de mantenimiento.
Añade este código al final de tu functions.php:
function netcodes_maintenance_mode() {
if (!current_user_can('manage_options') && !is_user_logged_in()) {
// Solo afecta a usuarios no logueados y sin permisos de admin
// Cabecera 503 con Retry-After
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 3600'); // 1 hora en segundos
// Carga la plantilla
include get_template_directory() . '/maintenance.php';
exit;
}
}
add_action('template_redirect', 'netcodes_maintenance_mode');Excepción para administradores
La condición current_user_can('manage_options') permite que cualquiera con rol de administrador (o superior) vea el sitio con normalidad. Así puedes seguir trabajando mientras el resto del mundo ve la página de mantenimiento. También comprobamos !is_user_logged_in() para que los usuarios logueados con otros roles no queden bloqueados por error.
Mejoras recomendadas
- Personalización: puedes añadir un logo, contador regresivo o formulario de suscripción cambiando el HTML de
maintenance.php. - Modo debug: envuelve el código en
if (!defined('WP_DEBUG') || !WP_DEBUG)para que nunca se active en entornos de desarrollo. - IP whitelist: si prefieres permitir acceso por IP en vez de por login, usa
$_SERVER['REMOTE_ADDR']y una lista de IPs permitidas.
Cómo activar y desactivar
Para activar el mantenimiento simplemente subes el código. Para desactivarlo comenta o borra el add_action. Si quieres controlarlo con un interruptor, crea una opción en Ajustes → General y comprueba su valor antes de lanzar el 503.
El uso correcto del código 503 junto con la cabecera Retry-After evita que Google penalice tu SEO durante el mantenimiento. Los buscadores entienden que es algo temporal y volverán después del tiempo indicado.
Con este método tienes una solución ligera, profesional y que no depende de terceros. Perfecta tanto para tiendas WooCommerce como para blogs o webs corporativas.