Escribe y presiona 'Enter'

Excluir categorías del Blog o la Portada en WordPress

Aprende a excluir categorías del loop de WordPress para no mostrar entradas o posts en el blog o la portada. Sin plugins. Sonríe.

¡Cómo va revoltosx del Gro.wW!

En este artículo te enseño el fragmento de código que necesitas para excluir taxonomías del tipo «Category» del loop de WordPress, y no mostrar los posts de ciertas categorías en el blog.

Cómo excluir categorías en el loop

Una de las principales características por las que WordPress se ha convertido en el CMS preferido de inumerables negocios, es por la facilidad con la que podemos crear, publicar y gestionar contenidos de forma estructurada gracias a las categorías. Ahora bien:

En el loop del blog, por sistema, WordPress muestra al usuario todas las entradas o posts que publicas, sin importar su categoría.

No importa si el blog es una sección más de tu web, o si has preferido que tu Home page muestre las últimas entradas. Por defecto, uses el tema que uses, se mostrarán en pantalla todas las publicaciones de todas las categorías.

Pero, ¿qué pasa si tú quieres excluir entradas de una o varias categorías?

Por ejemplo, es posible que en tu caso te interese:

  • Ocultar aquellos artículos privados, o Premium, que has configurado como contenidos exclusivos para un determinado grupo de usuarios.
  • No mostrar posts de una categoría en la sección blog, o en tu página principal si ésta es «tus últimas entradas».
  • Excluir entradas de una categoría que solo utilizadas para mostrar contenidos en un slider.

¿Alguno de estos supuestos te interesan?

Entonces no te pierdas lo que viene a continuación, porque veremos cómo indicar al loop que debe excluir ciertas categorías para no cargar sus publicaciones.

¿Qué archivo hay que editar?

Al igual que hemos visto en otros snippets para WordPress, hay un archivo mágico en el que vamos a configurar las entradas que queremos quitar del blog. Y, aunque me repito más que un aviso de cookies, ese archivo debe ser el de tu tema hijo (child theme).

Así que:

El fragmento de código, o snippet, que voy a enseñarte debes incluirlo en el archivo functions.php de tu tema (hijo).

Solo tienes que crear una copia antes de hacer cambios (recomendado), para después copiar y pegar el fragmento de código que te voy a explicar.

¿Qué hace exactamente el código?

Ahora bien, primero me gustaría aclarar que este fragmento de código no oculta posts o categorías en widgets, ni tampoco en plugins. Sino que:

El siguiente snippet excluye las entradas de una o varias categorías en el blog (home), o en la portada (home page) si está configurada como «tus últimas entradas».

Esto quiere decir que la categoría seguirá apareciendo en el widget «Categorías». Así que, obviamente, el usuario seguirá teniendo un acceso a esa página con el listado de sus entradas.

Si, además de ocultar sus contenidos, quisieras que la categoría no apareciera en el listado o desplegable del Widget, revisa este artículo donde te muestro cómo quitar categorías del widget «Categorías» de WordPress.

Código (snippet) para excluir categorías del Blog

¿Listx para excluir una categoría, o varias, de tu blog o Portada? aquí está fragmento de código que tienes que añadir a tu archivo functions.php:

function exclude_post_categories( $wp_query ) {
    if( $wp_query->is_main_query() && is_home() ) {
        $wp_query->set( 'cat', '-category_ID_1' ); //sustituir category_ID_1 por el ID de la categoría
    }
}
add_action( 'pre_get_posts', 'exclude_post_categories', 10, 1 );

Este fragmento de código lo que hace es:

  • Establecer que la consulta global is_main_query() excluye las ctegorías solo si es para la página de entradas (home).
  • Identificar los ID de las categorías precedidas del signo negativo «-«. Si quieres excluir más de una debes separarlas con una coma. Por ejemplo ‘1,2,3’.
  • Configura la prioridad de ejecución en 10 ($priority). Este es el valor por defecto, e indica la posición de ejecución con respecto a otras funciones que se enganchan (hook) al mismo filtro.
  • Determinar el número de argumentos que acepta la función en 1 ($accepted_args). Este también es el valor predeterminado.

Observaciones del snippet

Este código para excluir categorías de la página de entradas (ya sea una sección, o la página principal de tu web) es muy corto y simple.

Copiar, pegar, un par de ID’s, y en menos de un minuto estará funcional (siempre y cuando no entre en conflicto con otro snippet).

Recuerda que todos los snippets son genéricos y que, en función de aspectos como el theme, los plugins u otras funciones en tu functions.php, pueden generar incompatibilidades.

Conflictos en el orden de ejecución

Revisa las funciones que se enganchan a pre_get_post en tu functions.php. Si tienes varias es probable que entren en conflicto si no les das el orden de ejecución correcto.

Es importante que revises tu functions.php, y tengas en cuenta el orden de ejecución de otros snippets que modifiquen la WP_Query añadiéndose a pre_get_post.

¿Es tu caso?, entonces tienes que asignar un numero de ejecución más alto (menor prioridad), o que después en tu functions.php para que se ejecute a continuación y no antes.

Excluir categorías y ocultar posts en otras secciones

No me quiero repetir, pero insisto en que este código actúa solo sobre la página de entradas, o tu Home page si la tienes configurada como «tus últimas entradas».

Si quisieras excluir categorías en otras secciones diferentes al blog, debes reemplazar is_home() por la etiqueta condicional (conditional tags) de la página que la identifique.

De este modo, podrías utilizar algunas de las siguientes etiquetas condicionales (conditional tags):

  • is_search() para la página de resultados de búsqueda.
  • is_archive() para la página de categorías y/o etiquetas.
  • is_front_page() para la home page.
  • is_single() para la página individual de un post.

Por ejemplo, una acción muy común (en relación a este artículo) es también excluir categorías en los resultados de búsqueda.

Conocer el ID de las categorías

Por último, nada de esto tendría sentido si aún no sabes lo más básico de este fragmento de código: conocer el ID de la categoría que quieres excluir para no mostrar sus entradas.

Ver el ID único de cada categoría es una acción muy sencilla y rápida. Además, hay varias maneras de hacerlo, pero no me voy a entretener con esto en este post.

Si aún no sabes cómo, te invito a que revises este artículo en el que te enseño a obtener el Id de una categoría en WordPress (y también de otros elementos y/o publicaciones) en un abrir y cerrar de ojos.

Verificación de funcionamiento

Para verificar el funcionamiento correcto del código (tanto a nivel administrativo como a nivel usuario), antes de ocultar entradas y categorías vigila el comportamiento del snippet con tu instalación de WordPress.

Cuando incluyas el código para excluir los contenidos de una categoría, deberías notar que:

  • A nivel de administración, el escritorio de WordPress se mantiene intacto. Nada cambia, y todas las categorías están accesibles y editables.
  • A nivel usuario, deben estar ocultas las entradas de la/s categoría/s con una ID única (ni una más), y solo de la sección que hayas indicado (no de toda la web).

Ahora sí, ¿no has notado nada extraño?, ¿tienes el control sobre lo que se muestra y lo que no?, ¡Estupendo!, ya eres casi un experto del ocultismo.

Y tú, ¿ya has probado a excluir categorías del blog?, ¿conoces otras formas de conseguirlo?, ¿este tutorial te ha dado alguna idea para tu proyecto? deja un comentario y, ¡compartamos experiencias!

Sin comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *