✅Cómo Restringir una Categoría a Usuarios Registrados en WordPress (Sin Plugins)

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 es premium.
  • 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ía 27.

Paso 2: Añade este código al functions.php de tu tema hijo o en un snippet de 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 premium o 27 por 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.

Nos vemos en el siguiente tutorial. Un saludo.

Compartir Artículo