¿Tienes una web en la necesitas que solo los usuarios registrados puedan ver el contenido?. Seguro que WordPress tiene algo para esto ¿verdad? Pues prepárate, porque este es uno de esos temas donde nada funciona como esperas.
En este artículo te cuento todas las formas de hacer tu sitio privado: desde un codiguillo básico de tres líneas hasta protección a nivel de servidor, pasando por los plugins que hay disponibles. Y al final verás lo que he tenido que hacer yo mismo para conseguir un método infalible, después de darme cabezazos con todo lo anterior.
¿Cuándo necesitas restringir el acceso a tu WordPress?
Antes de meternos en el cómo, veamos el por qué. Hay muchas situaciones donde necesitas que tu sitio no sea accesible para cualquiera:
- Intranet de empresa – Documentación interna, manuales de procedimientos, recursos para empleados, directorio de contactos, políticas internas. Todo eso debería estar protegido, porque seguro que no quieres que un competidor pueda curiosear tus procesos internos ni que Google indexe información confidencial.
- Sitio en desarrollo para un cliente -Estás montando la web, el cliente quiere ir viendo los avances, pero no quieres que Google indexe un sitio a medio hacer. Tampoco quieres que cualquiera que conozca la URL pueda ver el trabajo en curso, con sus textos de prueba y sus «Lorem ipsum» por todas partes.
- Portal de formación o cursos – Los contenidos son para los alumnos matriculados, no para quien llegue de rebote desde un buscador. Si vendes cursos online lo último que quieres es que el contenido esté indexado y accesible para todo el mundo.
- Comunidad privada – Un foro interno, un club de socios, una asociación, un grupo de trabajo. El contenido es solo para miembros y las conversaciones deben quedarse dentro del grupo.
- Entorno de desarrollo o staging – Pruebas, experimentos, cosas que pueden explotar en cualquier momento. Mejor que nadie lo vea hasta que esté listo para producción.
- Tienda B2B – Precios especiales para distribuidores que no quieres que vean los clientes finales. O un catálogo exclusivo para mayoristas con condiciones diferentes a las de la tienda pública.
- Área de clientes – Documentación específica, facturas, histórico de pedidos, recursos descargables. Todo lo que solo debe ver quien ha contratado tus servicios.
En todos estos casos la solución parece obvia: forzar el inicio de sesión. Quien no esté registrado, que no pase, así que vamos qué opciones tenemos para conseguir algo así.
Proteger el acceso a WordPress con un codiguillo básico
La forma más rápida de hacer tu sitio privado es añadir unas pocas líneas de código. Este snippet redirige a cualquier visitante no identificado a la página de login:
/**
* Forzar inicio de sesión para ver el sitio
*/
function ayudawp_forzar_login_basico() {
if ( ! is_user_logged_in() && ! is_login() ) {
auth_redirect();
}
}
add_action( 'template_redirect', 'ayudawp_forzar_login_basico' );
Puedes añadirlo al functions.php de tu tema hijo, un plugin personalizado o, mucho mejor, mediante un MU plugin.
- Ventajas: Simple, rápido, sin plugins.
- Problema: Bloquea absolutamente todo. La API REST (adiós editor de bloques), los cron (adiós tareas programadas), los mapas del sitio (adiós SEO si lo necesitabas para algo), las peticiones AJAX (adiós formularios dinámicos)… Básicamente deja tu WordPress funcionando a medias.
Puedes ir añadiendo excepciones manualmente pero el código se complica rápido.
Proteger el acceso a WordPress desde el servidor
Otra alternativa es proteger el sitio directamente desde el servidor web, antes de que WordPress siquiera se ejecute.
Con Apache (.htaccess)
Puedes usar identificación HTTP básica añadiendo esto a tu .htaccess:
# Proteger todo el sitio con contraseña AuthType Basic AuthName "Acceso restringido" AuthUserFile /ruta/a/.htpasswd Require valid-user
Y crear el archivo .htpasswd con los usuarios y contraseñas (puedes generarlo con herramientas online).
- Ventajas: Muy seguro, bloquea antes de que WordPress cargue, no consume recursos PHP.
- Problemas:
- La ventana emergente de identificación es fea y no personalizable.
- No tira de los usuarios de WordPress, tienes que gestionar credenciales aparte.
- Bloquea también los cron, webhooks y cualquier petición automatizada.
- Algunos servicios de caché y CDN tienen problemas con la autenticación HTTP.
Con Nginx
Similar concepto pero con sintaxis diferente:
location / {
auth_basic "Acceso restringido";
auth_basic_user_file /etc/nginx/.htpasswd;
}
Los mismos problemas que con Apache: gestión de usuarios separada, ventana de identificación horrible y bloqueo de todo lo automatizado.
Bloqueo por IP
Si solo necesitas que accedan desde ciertas IPs (la oficina, una VPN) puedes restringir a nivel de servidor:
# Apache - permitir solo ciertas IPs Order Deny,Allow Deny from all Allow from 192.168.1.0/24 Allow from 203.0.113.50
# Nginx - permitir solo ciertas IPs
location / {
allow 192.168.1.0/24;
allow 203.0.113.50;
deny all;
}
- Ventajas: Muy efectivo para entornos controlados.
- Problemas: No sirve si los usuarios tienen IPs dinámicas o trabajan desde casa. Tampoco permite excepciones finas (esta página sí, esta no).
Proteger el acceso a WordPress con plugins, que los hay (más o menos)
Hay varios plugins en el repositorio para forzar el login. Estos son los más conocidos:
Force Login
El más popular, con más de 20.000 instalaciones activas. Hace exactamente lo que dice: fuerza el login para ver cualquier página.
- Limitaciones: Muy básico. No tiene página de ajustes, todo se configura con filtros y código, no detecta bots de buscadores, no permite excepciones por IP, no tiene tokens temporales. Si necesitas algo más que el comportamiento por defecto, tienes que programarlo tú.
My Private Site
Más opciones que Force Login: permite definir páginas públicas, tiene ajustes en el admin.
- Limitaciones: La versión gratuita es limitada. Las funciones avanzadas (landing page personalizada, exclusión de categorías, redirecciones, ahora dicen que IA) son de pago.
Password Protected
Protege el sitio con una contraseña única, sin necesidad de crear usuarios. No es exactamente pero es muy útil en según qué situaciones, y yo lo uso en alguna web muy básica.
- Limitaciones: Es una contraseña global, no identificación de usuarios, y no hay forma de saber quién accedió ni de dar permisos diferentes. No vale para nada serio.
Plugins de membresía
Plugins como MemberPress, Restrict Content Pro o Paid Memberships Pro permiten restringir contenido a usuarios registrados.
- Limitaciones: Es matar moscas a cañonazos si solo quieres forzar login. Están pensados para vender membresías, no para hacer un sitio privado. Además, la mayoría son de pago o tienen las funciones importantes en versiones premium.
Tenemos un problema ¿de verdad somos demasiado exigentes?
Yo creo que no, y es que después de probar todas estas alternativas el panorama es deprimente:
- Los códigos básicos rompen cosas – Bloquean la API REST, los cron, el AJAX, y arreglar cada cosa requiere añadir más código.
- La protección a nivel servidor no es flexible – No usa los usuarios de WordPress, no permite excepciones finas, la ventana emergente de identificación es horrible.
- Los plugins gratuitos son demasiado básicos – No detectan bots de buscadores, no permiten IPs, no tienen tokens temporales. El editor de bloques deja de funcionar con varios de ellos.
- Los plugins de pago cobran por funciones básicas – Quieres permitir ciertas páginas públicas, paga. Quieres que Google siga indexando, paga. Quieres dar acceso temporal sin crear usuarios, paga.
- A veces necesitas combinar varios plugins – Uno para forzar login, otro para gestionar excepciones de bots, otro para tokens temporales, cada uno con su configuración, sus posibles conflictos y sus actualizaciones que pueden romper la compatibilidad.
Y lo peor es cuando necesitas dar acceso temporal a alguien sin crearle una cuenta, ya sea un cliente que tiene que revisar el staging, una agencia externa que necesita echar un vistazo o un equipo de soporte técnico. Con la mayoría de soluciones la única opción es crear un usuario, darle acceso y luego acordarte de borrarlo. Spoiler: nunca te acuerdas de borrarlo.
Gozer «El guardián de la puerta»
Harto de esta situación, hace unos meses publiqué un código muy completo para forzar el login con todas las excepciones configurables. Funciona bien, de hecho es la rehostia bendita, una joyita, pero tiene un problema: hay que editar wp-config.php manualmente para cada cambio que quieras hacer a la configuración por defecto, no tiene interfaz gráfica y no ofrece ciertas funcionalidades como los tokens temporales. El mundo no es perfecto.
Así que di el siguiente paso y lo convertí en un plugin completo, que he llamado Gozer, y es completamente gratis.

Pero ¿qué hace? …
Protección al instante sin romper nada
Nada más activar Gozer, tu sitio queda protegido, porque se supone que es lo que quieres. Pero a diferencia de otros plugins viene con excepciones por defecto para que WordPress siga funcionando con normalidad. ¿Que quieres cambiar algo?, luego vamos con eso.
Empezando por lo básico, en la página de ajustes (Ajustes > Gozer) tienes una casilla para activar o desactivar la protección, pero seguro que lo primero que ves es un indicador en la barra de admin de WordPress, que muestra un punto verde cuando está activo y rojo cuando está desactivado. Ahí tienes además un interruptor rápido para cambiar el estado sin entrar en los ajustes, y de paso también un enlace a los ajustes. Majo ¿eh?
Vamos a por los ajustes, donde puedes configurar las excepciones y más cosas.
Excepciones del sistema
Estas opciones mantienen WordPress funcionando correctamente:
- REST API (activada por defecto) – Necesaria para el editor de bloques, WooCommerce, formularios de contacto y prácticamente cualquier plugin moderno. Desactivarla rompe Gutenberg.
- WP-Cron (activado por defecto) – Tareas programadas: publicaciones diferidas, emails automáticos, copias de seguridad, renovación de certificados…
- WP-CLI (activado por defecto) – Si administras tu WordPress desde terminal o con scripts automatizados.
- AJAX (activado por defecto) – Formularios de contacto, cargas dinámicas, funcionalidades sin recargar página.
- XML-RPC (desactivado por defecto) – Solo si usas la app móvil de WordPress o Jetpack. Es un método de ataque muy habitual, y por eso viene desactivado.
Cada opción incluye una explicación de qué pasa si la desactivas y cuál es el valor por defecto recomendado.
Excepciones SEO
Para que los buscadores puedan seguir indexando si lo necesitas:
- Mapas del sitio (activado por defecto) – Permite acceso a sitemap.xml, wp-sitemap.xml y sitemaps de plugins SEO.
- robots.txt (activado por defecto) – El archivo que indica a los rastreadores qué pueden indexar.
- Feeds RSS (desactivado por defecto) – Para lectores RSS. En un sitio privado normalmente no tiene sentido.
- Bots de motores de búsqueda (activado por defecto) – Gozer reconoce automáticamente Google (Googlebot, AdsBot-Google, Mediapartners-Google…), Bing, Yahoo, DuckDuckGo, Yandex, Baidu y otros. También los bots de redes sociales (Facebook, Twitter, LinkedIn, Pinterest) para que las previsualizaciones de enlaces funcionen.
Excepciones técnicas
- Peticiones HEAD (activadas por defecto) – Servicios de monitorización de uptime como Pingdom, UptimeRobot o StatusCake usan peticiones HEAD para comprobar si tu sitio está online.
- Archivos estáticos (desactivado por defecto) – Acceso público a CSS, JavaScript, imágenes y fuentes. Solo si tu página de login tiene problemas de estilos.
Excepciones personalizadas
Aquí defines exactamente qué debe quedar siendo público:
- Rutas permitidas – Páginas o secciones públicas:
/contacto/,/sobre-nosotros/,/landing/. Una por línea. Las subrutas se incluyen automáticamente. - IPs permitidas – Lista blanca de direcciones IP. Gozer soporta tres formatos:
- IPs individuales:
192.168.1.1 - Notación CIDR:
192.168.1.0/24 - Comodines:
192.168.*
- IPs individuales:
- Agentes de usuario permitidos – Para servicios o herramientas con
user agentespecífico que no esté en la lista de bots reconocidos.
Comportamiento al redireccionar
¿Qué pasa cuando alguien sin permiso intenta acceder?
- Redirigir a página de acceso (por defecto) – El visitante va a
wp-login.phpy tras identificarse vuelve a la página que intentaba ver. - Mostrar error 403 prohibido – Mensaje de acceso denegado. Si tu tema tiene plantilla
403.phpla usa. - Redirigir a URL personalizada – Una landing de registro, formulario de solicitud de acceso, web principal de tu empresa, lo que prefieras.
Tokens de acceso temporal

Esta es la funcionalidad que más echaba en falta y que ningún plugin gratuito la ofrece.
¿Necesitas que un cliente revise el staging? ¿una agencia externa tiene que echar un vistazo? ¿el equipo de soporte necesita acceso puntual? En lugar de crear usuarios y acordarte de borrarlos generas un token temporal para poder ver la web.
Desde la página de ajustes:
- Eliges la duración: 1 hora, 6 horas, 24 horas, 48 horas o 7 días.
- Añades una nota opcional para recordar para qué era.
- Generas el enlace con un clic.
El resultado es una URL como https://tusitio.com/?gozer_bypass=TOKEN que compartes. Quien acceda con ese enlace ve el sitio sin identificarse como usuario, y cuando el token caduca el acceso desaparece automáticamente.
En la tabla de tokens activos ves todos los que has generado, cuándo caducan, la nota que les pusiste, y puedes copiar el enlace o borrarlos.
¿Y ese nombre tan raro, por qué se llama Gozer?
Si has visto «Los cazafantasmas» (Ghostbusters, la original de 1984, no el resto de basuras posteriores), recordarás a Gozer el Gozeriano, la entidad sobrenatural, principal enemigo de los cazafantasmas, que hace esa pregunta mitiquísima de «¿Eres tú un dios?» antes de decidir quién pasa y quién no.
Pues eso hace exactamente este plugin, decidir quién accede a tu sitio y quién se queda fuera. El subtítulo «El guardian de la puerta» viene del personaje de Sigourney Weaver poseída que custodiaba la puerta, otra escenaza.
Luego, otro momento friki del plugin, pero nada molesto y en realidad bastante oculto, a modo de huevo de Pascua, es cuando alguien o algo intenta acceder sin permiso y le salta el error 403, el mensaje dice:

Si eres fan lo entenderás, y como a mi, hasta te hará gracia.
¿Es gratis?
Pues sí, a pesar de tantas opciones, configuraciones y funcionalidades, Gozer está ya en el repositorio oficial de WordPress.org, completo y gratis sin muros de pago ni características capadas:
- Ve a «Plugins > Añadir nuevo».
- Busca «Gozer».
- Instala y activa.
Nada más activarlo aparece un aviso con el resumen de qué excepciones están activas. La protección ya funciona con valores seguros. Si quieres ajustar algo, ve a «Ajustes > Gozer» y que el Gozeriano te proteja.
Resumen: qué opción elegir
- Si solo necesitas algo rápido y temporal: el codiguín sencillo, de solo tres líneas al principio de este artículo. Pero prepárate para que algunas cosas no funcionen.
- Si controlas el servidor y los usuarios tienen IPs fijas: protección por IP a nivel de Apache/Nginx. Rápido y efectivo.
- Si necesitas control total sin interfaz: el mega-código avanzado con constantes que publiqué anteriormente. Configuras todo en
wp-config.php. - Si quieres algo que funcione bien, completo, visual y gratis: Gozer. Protección inmediata, excepciones configurables, tokens temporales y todo desde una página de ajustes.
→ Más información sobre Gozer en WordPress.org
→ Prueba Gozer en tu navegador sin tener que instalarlo
Pues nada más, y tú ¿usas alguna forma de hacer tu WordPress privado? Cuéntame en los comentarios qué tal te va o si tienes alguna duda sobre Gozer.
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!













Súbanle el sueldo ya a este señor.
¡¡¡¡¡¡Gracias!!!!!!!
jaja, estas cosas las hago gratis 😀
Me alegra que te guste
Qué crack!
Gracias Fernando, es sencillamente genial.
Perfecto para el desarrollo de betas o web en mantenimiento.
A parte de otros usos que se me ocurren.
Yo lo tengo puesto en membresías, por ejemplo, ya puestos 😀