Como excluir categorías de la portada de un WordPress
Los desarrolladores de WordPress se han encargado de agregar muchas opciones al núcleo de este, una de estas es la posibilidad de manipular que posts de X categoría (o etiqueta) serán mostrados en la portada y demás secciones de un sitio.
Supongamos que tenemos la categoría “minipost” y que el ID de esta es el 19
, y queremos que los posts de esta categoría no salgan en la portada y el feed principal del blog; Dependiendo de como se categorizen los posts del blog, la categoría “miniposts” podría ser una “sección aparte” del sitio.
Para esto solo necesitamos agregar un pequeño plugin:
<?php /* Plugin Name: Excluir categorías Plugin URI: http://www.maestrosdelweb.com Description: Excluir categoriías de la portada de WordPress Version: 0.2 Author: Javier Aroche Author URI: http://www.maestrosdelweb.com */ function exclude_cat($query) { if ( $query->is_home || ($query->is_feed && $query->query_vars['category_name']=='') ) { $query->set('cat','-19'); } return $query; } add_filter('pre_get_posts','exclude_cat');
Toda la exclusión funciona gracias a $query->set('cat','-19');
. Los valores negativos significan exclusión y los positivos, obviamente para incluir categorías. Esto se ejecutará cuando se está en la portada o en el feed de la portada.
Si quisiéramos excluir varias categorías, basta con separarlas por comas:
$query->set('cat','-19,-3,-26');
También se pueden se pueden excluir de otras secciones del blog, digamos que en la categoría “Internet” tampoco se muestren los posts de “minipost” (o bien podrían no agregar la categoría Internet en primer lugar 😉 ).
Solo una aclaración sobre esto: WordPress tiene un bug al excluir posts entre categorías, ya lo había reportado hace tiempo; si quieren usar esta opción solo apliquen el parche que subí en el reporte del bug. El parche solo es necesario para excluir posts de una categoría (X), cuando se ven los de otra categoría (Y).
Una vez parchado WP, hay que agregar una condición más antes del return $query;
:
if ( $query->is_category && $query->query_vars['category_name']!='minipost') { $query->set('cat','-19'); }
El valor de $query->query_vars['category_name']
es el category slug.
Y así todos los posts de “minipost” quedan fuera del sitio, excepto cuando se visita la página de esta categoría (/category/minipost/) y el feed de esta. Esto es útil cuando se están mostrando en el sidebar del sitio usando get_posts(), no tendría sentido mostrarlos dos veces
Interesante, yo lo hago utilizando el action “parse_request” y le asigno el ID de la categoría que quiero excluir a la variable “category__not_in”, así:
Me funciona muy bien
usar
$query->set()
o modificar directamente las$query_vars
es equivalenteResulto bastante interesante el tutorial, curiosamente hoy iba a realizar la búsqueda de algo como esto.
javier te felicito eres todo un experto en wordpress
saludos
¿Sabes cuanto te quiero jaroche?
Mucho, mucho.
¡Gracias por el tutorial!
Yo utilizo un plugin directamente, que se llama simply exclude. Igualmente creo que es más interesante hacerlo de la forma que propones aquí, manualmente =)
un saludo
así es, no está de más saber que es lo que ese plugin haría 😉