Excluir la categoría del bucle de WordPress

7 mar 2012, 01:37:35
Vistas: 28K
Votos: 6

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;
?>
0
Todas las respuestas a la pregunta 4
4
13

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);
    }
}
7 mar 2012 08:15:58
Comentarios

Vota a favor de Helga ya que ella mencionó pre_get_posts primero.

Brad Dalton Brad Dalton
4 sept 2014 08:33:01

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.

honk31 honk31
6 jun 2019 17:01:40

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

Ares Ares
26 abr 2020 00:42:53

¿De verdad estás troleando en una publicación de hace 8 años para burlarte del hecho de que usé un nombre de función único con casi un 0% de probabilidad de entrar en conflicto con algo?

helgatheviking helgatheviking
27 abr 2020 17:18:08
0

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.

3 sept 2014 18:56:52
3

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í

7 mar 2012 01:46:37
Comentarios

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.

jimilesku jimilesku
7 mar 2012 01:50:46

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]';

jimilesku jimilesku
7 mar 2012 01:51:00

la paginación aparece, y puedo hacer clic en ella, pero la página 2 muestra las mismas publicaciones que la página 1, y la página 3 muestra un error 404? Por favor ayuda :)

jimilesku jimilesku
7 mar 2012 02:05:11
0

Adam tiene razón. Además, para que la paginación funcione, necesitas tener algo más como esto:

<?php query_posts('post_type=post&paged='.$paged.'&cat=-4');  ?>
7 mar 2012 04:39:20