Un espacio para los entusiastas del web

8 com comentarios en total.
15 Mar 2010
3,586 Lecturas
Tags: PHP, Gestores de Contenidos, Desarrollo Web, ,

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

Javier ArocheJavier Aroche para Maestros del Web.
Agrega tu comentario | Enlace permanente al artículo

Síguenos en: @maestros | Fan page

Comentarios

  1. 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í:

    $params->query_vars["category__not_in"] = $catNotIn;
    

    Me funciona muy bien :)

    Responder
    1. usar $query->set() o modificar directamente las $query_vars es equivalente :)

  2. Resulto bastante interesante el tutorial, curiosamente hoy iba a realizar la búsqueda de algo como esto.

    Responder
  3. javier te felicito eres todo un experto en wordpress
    saludos

    Responder
  4. ¿Sabes cuanto te quiero jaroche?

    Mucho, mucho.

    Responder
  5. ¡Gracias por el tutorial!

    Responder
  6. 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

    Responder
    1. así es, no está de más saber que es lo que ese plugin haría ;)

Deja tu Comentario

Maestros del Web se reserva el derecho de moderación de los comentarios. Evita utilizar palabras soeces, ataques directos, descalificativos, insultos, de lo contrario tu comentario será eliminado.



Acerca de
Maestros del Web nace cuando intentamos traducir Webmaster al Español. Nacimos orientados al diseño y desarrollo web. Hoy somos un espacio de apoyo para los entusiastas que participan en proyectos en la red.
Leer más de Maestros del Web