A veces solo quieres hacer algo muy simple: que una categoría concreta de tu blog solo esté visible para los usuarios que están registrados. Nada más. No necesitas un plugin de membresía ni un sistema de roles avanzado. Solo quieres que, por ejemplo, todo lo que publiques en la categoría “Premium” no lo pueda leer cualquiera.
Y lo mejor: se puede hacer con unas pocas líneas de código. Sin plugins, sin complicaciones.
Qué vamos a hacer exactamente
Vamos a proteger una categoría concreta de WordPress para que solo sea accesible a usuarios registrados. Si alguien no está logueado e intenta acceder a una entrada de esa categoría, lo redirigiremos al formulario de login (o a donde tú quieras).
Paso 1: Identifica el slug o el ID de la categoría que quieres proteger
Ve a tu panel de WordPress → Entradas → Categorías y busca la categoría que quieres proteger.
- Si la URL es algo como
tusitio.com/category/premium, entonces el slug espremium. - O si prefieres trabajar con el ID, pasa el ratón sobre el nombre y verás algo como
tag_ID=27. En ese caso, el ID sería27.
Paso 2: Añade este código al functions.php de tu tema hijo o en un snippet de Code Snippets
- Tutorial functions.php
- Tutorial Code Snippets
Te dejo dos versiones del mismo snippet: una usando el slug, y otra usando el ID.
Versión 1: proteger por slug
function restringir_categoria_para_usuarios_no_registrados( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( is_single() && ! is_user_logged_in() ) {
$post_categories = wp_get_post_categories( get_the_ID(), ['fields' => 'slugs'] );
if ( in_array( 'premium', $post_categories ) ) {
wp_redirect( 'https://misitio.com/acceder' );
exit;
}
}
}
add_action( 'pre_get_posts', 'restringir_categoria_para_usuarios_no_registrados' );Lenguaje del código: PHP (php)
Versión 2: proteger por ID
function restringir_categoria_id_para_no_registrados( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( is_single() && ! is_user_logged_in() ) {
$post_categories = wp_get_post_categories( get_the_ID() );
if ( in_array( 27, $post_categories ) ) {
wp_redirect( 'https://misitio.com/acceder' );
exit;
}
}
}
add_action( 'pre_get_posts', 'restringir_categoria_id_para_no_registrados' );
Lenguaje del código: PHP (php)
- Cambia
premiumo27por el slug o el ID de la categoría que tú quieras proteger.- Cambia https://misitio.com/acceder por la url donde el usuario no logueado será redirigido.
Bonus: Ocultar esa categoría del loop si el usuario no está logueado
¿No quieres que esa categoría ni siquiera aparezca en la home o en los listados? Puedes usar esto:
function ocultar_categoria_para_no_logueados( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( ! is_user_logged_in() ) {
$query->set( 'category__not_in', array( 27 ) ); // usa el ID de la categoría
}
}
add_action( 'pre_get_posts', 'ocultar_categoria_para_no_logueados' );
Lenguaje del código: PHP (php)
Conclusión
No hace falta montar un sistema de membresía completo para algo tan específico. Si solo quieres proteger una categoría y asegurarte de que solo los usuarios registrados puedan ver su contenido, este método es limpio, ligero y efectivo.
Y como siempre: si más adelante necesitas algo más potente (contenido condicional, suscripciones, etc.), puedes escalarlo con plugins como Ultimate Membership Pro, Restrict Content Pro o MemberPress. Pero si solo quieres restringir una categoría, esto es más que suficiente.




¿Tienes alguna duda? Déjala en los comentarios.