Excluir la categoría del bucle de WordPress
Tengo este código para el bucle, y necesito excluir una categoría 4
de este bucle. ¿Alguna sugerencia sobre cómo lograr esto?
Código que inicia el bucle
<?php if(have_posts()): ?>
<ol class="item_lists">
<?php
// Array con números finales
$end = array(3,6,9,12,15,18,21,24,27,30,33,36,39,42,45);
$i = 0;
while (have_posts()) : the_post();
$i++;
global $post;
?>

podrías usar wp_parse_args() para combinar tus argumentos con la consulta por defecto
// Definir los argumentos de consulta por defecto
global $wp_query;
$defaults = $wp_query->query_vars;
// Tus argumentos personalizados
$args = array('cat'=>-4);
// combinar los argumentos por defecto con los personalizados
$args = wp_parse_args( $args, $defaults );
// consultar posts basados en los argumentos combinados
query_posts($args);
sin embargo, creo que la ruta más elegante es usar la acción pre_get_posts(). esto modifica la consulta antes de que se realice, evitando que la consulta se ejecute dos veces.
revisa:
http://codex.wordpress.org/Custom_Queries#Category_Exclusion
basado en ese ejemplo, para excluir la categoría 4 del índice, pondría esto en tu functions.php:
add_action('pre_get_posts', 'wpa_44672' );
function wpa_44672( $wp_query ) {
//$wp_query se pasa por referencia. no necesitamos retornar nada. cualquier cambio hecho dentro de esta función afectará automáticamente la variable global
$excluded = array(4); //convertido en array por si necesitas excluir más de una categoría
// solo excluir en la página de inicio
if( is_home() ) {
set_query_var('category__not_in', $excluded);
//que es simplemente la forma más elegante de escribir:
//$wp_query->set('category__not_in', $excluded);
}
}

en lugar de 'category__not_in' o 'category__in', podrías usar 'cat' y utilizar una cadena como valor, por ejemplo '2,-4'
. De esta manera, no solo se incluiría/excluiría la categoría especificada, sino también sus hijas.

Señorita, ha cometido un crimen horrible. ¡Debería darle vergüenza! ¿Nombre de función "wpa_44672"? ¿En serio? :P

Desde tu archivo de funciones
function remove_home_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-4' );
}
}
add_action( 'pre_get_posts', 'remove_home_category' );
Este código modifica la consulta antes de que se ejecute la consulta real, por lo que es el gancho más eficiente para modificar el loop en este caso.

Antes de la línea
<?php if(have_posts()): ?>
Inserta algo como esto
<?php query_posts($query_string . '&cat=-4'); ?>
Esto excluye la categoría con ID 4. Como se ve aquí

efectivamente elimina las publicaciones de esa categoría, pero es una especie de portafolio en la página del usuario, y ahora la paginación está rota en la página 3.

También tengo esto personalizado en el theme_setup.php: $newrules["user/({$author->nicename})/(portfolio)/?$"] = 'index.php?author_name=$matches[1]&baction=$matches[2]'; $newrules["user/({$author->nicename})/(portfolio)/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&baction=$matches[2]&paged=$matches[3]';
