web-dev-qa-db-fra.com

Query Posts Exclude Toute la catégorie

J'utilise la boucle wordpress standard qui ressemble à:

    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
        <h2><?php the_title(); ?></h2>
    <?php endwhile; else: ?>
        <h2>We're sorry...there is no content.</h2>
    <?php endif; ?>

Ensuite, ce que je voulais faire était d'exclure une certaine catégorie de ma requête. Mon code est donc devenu:

    <?php 
        $parent = get_cat_ID("Sports");
        query_posts("cat=-".$parent); 
    ?>
        <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
            <h2><?php the_title(); ?></h2>
        <?php endwhile; else: ?>
            <h2>We're sorry...there is no content.</h2>
        <?php endif; ?>
    <?php wp_reset_query(); ?>

Ce que je pensais être juste sur l'argent ...

J'ai donc fait des recherches et découvert que cela excluait uniquement la catégorie, pas la catégorie et ses sous-catégories. Existe-t-il un moyen d’exclure de la boucle une catégorie spécifique et toutes ses sous-catégories?

Merci josh

1
Josh Rodgers

Je vous recommande d'utiliser le filtre pre_get_posts ou le fossé query_posts et d'utiliser WP Query.

De cette façon, vous pouvez facilement utiliser le paramètre category__not_in (array) et ne déranger aucune autre boucle.

function exclude_category($query) {

// this requires term id instead of term name so change "20" to the "sport" id
// this assumes "sports" is in a category and not a custom taxonomy
$child_cats = (array) get_term_children('20', 'category');

//only effect main home page query 
if ( $query->is_home() && $query->is_main_query() ) {
$query->set('category__not_in',array_merge(array('20'), $child_cats));
return $query;
}
}

add_filter('pre_get_posts', 'exclude_category');

ps. Je n'ai pas testé cela, mais en théorie, cela devrait fonctionner.

1
Wyck

Cela devrait vous aider:

Récupère les enfants de la catégorie parent

Lisez toutes les sous-catégories du parent, passez en boucle sur le résultat pour en obtenir tous les identifiants, puis incluez tous les identifiants dans l'appel à query_posts ().

Par exemple (non testé):

$parent = get_cat_ID("Sports");
$kids = get_categories( array( 'parent' => $parent ) );
$a = array( $parent );
foreach ( $kids as $kid )
{
  $a[] = $kid->ID;
}

query_posts( "cat=-" . implode( ",", $a ) ); 
0
Steve Claridge