Skip to content

Todo para WordPress, el desarrollo web — y mucho más

🔒 Cómo restringir el acceso a tipos de contenido personalizados de WordPress: una guía paso a paso

🔒 Cómo restringir el acceso a tipos de contenido personalizados de WordPress: una guía paso a paso

Imagínelo: lanza un portal corporativo en WordPress, crea un tipo de contenido personalizado llamado «Equipamiento» y lo llena con documentación interna. Una semana después descubre que todas esas páginas están siendo indexadas por los motores de búsqueda y son visibles para cualquiera que pase por ahí. El acceso debería estar limitado a empleados autorizados, pero el suyo está abierto de par en par.

Las herramientas integradas de WordPress no permiten restringir de forma selectiva un tipo de contenido personalizado específico para usuarios no registrados. Existen roles y capacidades, pero la vinculación «los invitados no pueden ver el CPT X» no está disponible de serie. La solución consta de tres componentes: registro del CPT, configuración de roles y un plugin de restricción de lectura. El cuarto componente (opcional) es el inicio de sesión social para que los empleados no tengan que introducir una contraseña cada vez.

Primer plano de una pantalla con código de programación, desarrollo web

A continuación se desglosa paso a paso cada componente, con plugins y ajustes concretos. Todas las herramientas son gratuitas, están disponibles en el directorio oficial de WordPress.org y no requieren programación, aunque al final se cubre un enfoque puramente basado en código para quienes quieran evitar los plugins.

💡 Resumen rápido:

  • Registre un tipo de contenido personalizado mediante Custom Post Type UI sin escribir una sola línea de código
  • Cree un rol personalizado en PublishPress Capabilities y asígnelo a los empleados
  • Restrinja el acceso de invitados al CPT usando el plugin WP Access Areas: los visitantes no autorizados son redirigidos a la página de inicio de sesión
  • Opcionalmente, active el inicio de sesión social a través de Super Socializer para un acceso sin contraseña con cuenta de Google

Paso 1: Registrar un tipo de contenido personalizado

La primera etapa, y la más sencilla, es crear el CPT en sí. No necesita tocar functions.php para esto: el plugin Custom Post Type UI en WordPress.org proporciona una interfaz gráfica para registrar cualquier tipo de contenido y taxonomía.

La instalación es la habitual: «Plugins → Añadir nuevo», busque por nombre, active. Tras la activación, aparece un nuevo elemento de menú en la barra lateral: «CPT UI → Añadir/Editar tipos de contenido». Rellene los campos: slug (por ejemplo, equipment), nombres en plural y singular, etiquetas, y haga clic en «Añadir tipo de contenido».

Interfaz del plugin Custom Post Type UI para crear un tipo personalizado

El plugin llama a register_post_type() con los parámetros correctos automáticamente. No se requiere código manual: obtiene un tipo de contenido plenamente funcional con soporte de editor, archivos y API REST. Si más adelante necesita trasladar el registro a functions.php, CPT UI muestra el código PHP generado en la pestaña «Herramientas».

Durante el registro, preste atención a dos opciones críticas relacionadas con la seguridad. En el bloque «Ajustes» de CPT UI, hay una opción «Consultable públicamente» que determina si las entradas pueden abrirse mediante enlaces directos. Viene activada por defecto, e incluso después de restringir la lectura mediante un plugin, debe dejarla habilitada; de lo contrario, WordPress devolverá un error 404 en lugar de redirigir a la página de inicio de sesión, y los usuarios no entenderán qué ha ocurrido. El segundo parámetro, «Tiene archivo», habilita una página de archivo que lista todas las entradas del CPT. Si no necesita un archivo, desactívelo para que los motores de búsqueda no indexen una página de servicio con vistas previas de documentos restringidos.

Paso 2: Crear un rol personalizado

Simplemente restringir el acceso de invitados al CPT no basta: necesita un rol que sí tenga acceso. Por defecto, WordPress ofrece un conjunto fijo: Administrador, Editor, Autor, Colaborador, Suscriptor. Crearemos un nuevo rol usando el plugin PublishPress Capabilities (antes llamado Capability Manager Enhanced, mismo slug, misma funcionalidad, solo cambió el nombre).

Página de gestión de roles en el plugin PublishPress Capabilities

Tras la activación, vaya a «Capabilities → Roles». En el lado derecho de la pantalla encontrará el bloque «Create New Role»:

Formulario para crear un nuevo rol personalizado en PublishPress Capabilities

Introduzca un nombre (por ejemplo, «Lector de Equipos»), seleccione un rol base del cual clonar (Suscriptor es lo mejor, por tener permisos mínimos) y haga clic en «Create». El nuevo rol ya existe y puede poblarlo con capacidades. Para leer un CPT, la combinación estándar de read + read_equipment (la capacidad registrada por CPT UI) es suficiente.

Asigne el rol creado a los empleados que necesiten acceso al contenido restringido. Después de esto, puede desactivar el plugin: los roles y capacidades permanecen en la base de datos de WordPress y no dependen de que PublishPress Capabilities esté activo.

Panel de configuración de permisos de acceso para roles en PublishPress Capabilities

Paso 3: Restringir el acceso de lectura al CPT

Este es el paso clave. El plugin WP Access Areas le permite definir con precisión quién puede leer, editar y comentar las publicaciones de cada tipo, hasta páginas individuales. Tiene unas modestas 400 instalaciones activas y no ha recibido actualizaciones mayores en un tiempo, pero para la tarea de «restringir el CPT a invitados» funciona de forma predecible y sin conflictos.

Página del plugin WP Access Areas en el directorio de WordPress

Tras la instalación, vaya a «Settings → Access Areas». En la sección «Default Behaviour», seleccione:

«If not logged in, redirect to login. Otherwise redirect to the fallback page.»

Esta configuración envía a los usuarios no autorizados a wp-login.php cuando intentan abrir cualquier página protegida del CPT.

Ajustes principales de comportamiento del plugin WP Access Areas

A continuación, aparece una tabla con todos los tipos de contenido registrados. Para su CPT, en la columna «Reading», seleccione «Logged in Users» del menú desplegable. Eso es todo: a partir de este momento, cualquier invitado que siga un enlace directo a una página del CPT será redirigido al formulario de inicio de sesión.

Nota importante: los ajustes realizados mediante la tabla solo se aplican a las nuevas publicaciones. Para las páginas ya creadas, debe establecer los permisos manualmente en la barra lateral del editor, donde aparece un bloque «Access Areas». Tras la configuración, asegúrese de verificar el resultado en el modo incógnito de su navegador: al abrir un enlace directo a una página protegida del CPT debería ver wp-login.php, no el contenido.

Bloque de configuración de acceso de lectura en el editor de entradas de WordPress

Alternativas a WP Access Areas si necesita una solución con mantenimiento más activo: PublishPress Permissions (la versión gratuita cubre CPT y roles) o ContentGate (un plugin ligero con reglas basadas en estado de inicio de sesión y roles).

Paso 4: Inicio de sesión social (opcional)

Introducir constantemente un usuario y contraseña en un portal corporativo genera una fricción innecesaria. La solución lógica: inicio de sesión con un clic mediante cuenta de Google. El plugin Super Socializer resuelve esta tarea, con más de 20.000 instalaciones activas y soporte para Google, Facebook, X (Twitter) y una docena de proveedores más.

Resumen de las funciones del plugin Super Socializer para inicio de sesión social

Tras la activación, vaya a «Super Socializer → Social Login»:

Pestaña de configuración de inicio de sesión social en el plugin Super Socializer

Ajustes básicos: active la casilla «Disable user registration via social networks». Esto es importante para que solo las cuentas existentes puedan iniciar sesión a través de redes sociales, en lugar de crear otras nuevas. Luego seleccione el proveedor (Google) e introduzca el Client ID y el Client Secret. Dónde obtenerlos:

  • Abra Google Cloud Console, cree un proyecto (o seleccione uno existente)
  • En la sección «APIs & Services → Credentials», haga clic en «Create Credentials → OAuth client ID»
  • El tipo de aplicación es Web application; en Authorized redirect URIs, pegue la URL de callback de los ajustes de Super Socializer
  • Guarde para obtener su Client ID y Client Secret
Creación de un cliente OAuth en la consola de Google Cloud para autorización social

Copie las claves en los campos del plugin:

Relleno de los campos Client ID y Client Secret para la autorización de Google en Super Socializer

Punto crítico: el campo Authorized redirect URIs no debe llevar barra diagonal al final, o recibirá un error redirect_uri_mismatch. Tras guardar, aparece un botón «Sign in with Google» en la página de inicio de sesión.

Importante: la versión original de este artículo (2020) describía la integración con Google+, que se cerró en abril de 2019. El Super Socializer moderno utiliza el protocolo estándar Google OAuth 2.0 a través de Google Identity Services. La interfaz de Google Cloud Console se ha actualizado desde entonces, pero la lógica de los pasos (proyecto → Credentials → OAuth client ID → redirect URI) sigue siendo la misma.

Enfoque alternativo: todo en código

Si los plugins adicionales no son deseables, la tarea puede resolverse en el functions.php del tema o en un tema hijo. El código registra el CPT, crea un rol y engancha una verificación de autorización a la plantilla:

1// Registering a custom post type
2function register_equipment_cpt() {
3 register_post_type('equipment', [
4 'labels' => ['name' => 'Equipment', 'singular_name' => 'Equipment'],
5 'public' => true,
6 'has_archive' => true,
7 'supports' => ['title', 'editor', 'thumbnail'],
8 'capability_type' => 'equipment',
9 'map_meta_cap' => true,
10 ]);
11}
12add_action('init', 'register_equipment_cpt');
13
14// Creating a role on theme activation
15function add_equipment_reader_role() {
16 add_role('equipment_reader', 'Equipment Reader', ['read' => true, 'read_equipment' => true]);
17}
18add_action('after_switch_theme', 'add_equipment_reader_role');
19
20// Redirecting guests from CPT to login page
21function restrict_equipment_to_logged_in() {
22 if (is_singular('equipment') && !is_user_logged_in()) {
23 wp_redirect(wp_login_url(get_permalink()));
24 exit;
25 }
26}
27add_action('template_redirect', 'restrict_equipment_to_logged_in');

Lo que hace este código: el primer bloque registra el CPT equipment con su propio tipo de capacidad (capability_type). El segundo bloque crea el rol Equipment Reader con permisos para leer este CPT cuando se activa el tema. El tercer bloque verifica la autorización en el gancho template_redirect y envía a los visitantes a wp-login.php.

La ventaja del enfoque con código: cero plugins adicionales, control total. La desventaja: el inicio de sesión social seguirá requiriendo un plugin (escribir la integración OAuth manualmente es lento e inseguro), y cada cambio en los roles implica editar código.

⁉️🤔 Preguntas frecuentes

¿Puedo restringir un CPT sin plugins, solo mediante funciones.php?

Sí. La combinación de register_post_type() + add_role() + el gancho template_redirect con una verificación is_user_logged_in() es una solución completamente funcional. El código se proporciona en la sección anterior. El inicio de sesión social sin un plugin es significativamente más difícil de implementar: la integración OAuth manual requiere manejar tokens, estado y seguridad.

¿Por qué WP Access Areas en lugar de un plugin más nuevo como ContentGate?

WP Access Areas es una herramienta minimalista para una tarea específica: «restringir un tipo de contenido a los visitantes». No trae consigo un constructor de reglas, editores visuales ni suscripciones. Si necesita una lógica más compleja (por ejemplo, diferentes niveles de acceso para distintos roles en el mismo CPT), use ContentGate o PublishPress Permissions, que se actualizan activamente. Para el escenario básico de esta guía, WP Access Areas es suficiente.

¿Qué debo hacer si los visitantes aún pueden ver las páginas del CPT después de la configuración?

Tres causas típicas. Primera: la configuración «Logged in Users» en la tabla de WP Access Areas solo se aplica a las nuevas publicaciones; para las páginas existentes, debe establecer los permisos manualmente a través de la barra lateral del editor. Segunda: un plugin de caché está sirviendo una versión almacenada en caché de la página a los visitantes; limpie la caché y configure exclusiones para el CPT protegido. Tercera: el CPT está registrado con 'publicly_queryable' => true y el slug entra en conflicto con una página pública; verifique las colisiones.

¿Puedo usar Super Socializer solo para el inicio de sesión, sin compartir ni comentarios?

Sí, los módulos del plugin son independientes. En la pestaña «Social Sharing», desmarque todas las casillas y los botones «Share» desaparecerán. En la pestaña «Social Commenting», desactive la integración. Deje solo «Social Login» con los proveedores que necesite. El plugin es ligero y desactivar los módulos innecesarios no afecta al rendimiento.

¿Es seguro desactivar PublishPress Capabilities después de crear un rol?

Sí. Los roles y capacidades de WordPress se almacenan en la tabla wp_options (la opción wp_user_roles) y no dependen del plugin que los creó. Después de desactivar PublishPress Capabilities, todos los roles creados y los permisos otorgados se conservan. Puede reactivar el plugin si necesita modificar los permisos más adelante.

¿Escribir código o quedarse con los plugins?

La elección entre plugins y functions.php se reduce a dos factores: la cantidad de CPT que se protegen y la frecuencia con la que cambian los permisos.

Si tiene un solo CPT (como el ejemplo del equipo), los roles son estables y está dispuesto a escribir 30 líneas de código una vez, el enfoque de functions.php es más limpio: no genera plugins, no depende de actualizaciones de terceros y es completamente transparente. Puede mantener Super Socializer para el inicio de sesión social, ya que resuelve una tarea concreta y no entra en conflicto con el código personalizado.

Si tiene varios CPT, los permisos se revisan con frecuencia o el sitio lo gestiona alguien que no es desarrollador, opte por la combinación de plugins. CPT UI + PublishPress Capabilities + WP Access Areas (o ContentGate) se pueden configurar desde el panel de administración en 15 minutos sin tocar código. Además, PublishPress Capabilities realiza automáticamente copias de seguridad de los roles con cada cambio, lo que permite revertir en dos clics.

En cualquier escenario, siga el principio: una herramienta para una tarea. No instale una potente solución todo en uno para una sola casilla de verificación, y no reinvente la rueda si un plugin existente hace exactamente lo mismo de forma más rápida y segura.

El control de versiones merece una consideración aparte. El código de functions.php reside en el repositorio del tema, los cambios se rastrean a través de Git y, al migrar el sitio, los roles se recrean automáticamente en el gancho after_switch_theme. El enfoque con plugins no ofrece esta transparencia: los roles se almacenan en la base de datos y, al desplegar una copia de staging o transferir a un nuevo dominio, deben recrearse manualmente o mediante un script de migración. Este factor a menudo resulta decisivo a favor del código para equipos que practican CI/CD y despliegue basado en Git.