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 :)