查询帖子排除整个类别

时间:2012-12-07 作者:Josh Rodgers

我使用的是标准wordpress循环,如下所示:

    <?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 
        $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(); ?>
我认为这在钱上是对的。。。

所以我做了一些研究,发现这只是排除了类别,而不是类别及其子类别。有没有办法从循环中排除特定类别及其所有子类别?

谢谢Josh

2 个回复
最合适的回答,由SO网友:Wyck 整理而成

我建议您使用pre_get_posts 过滤器或沟渠query_posts 和使用WP Query.

这样您就可以轻松使用category__not_in (array) 参数,而不会弄乱任何其他循环。

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\');
附言:我没有测试这一点,但理论上它应该是可行的。

SO网友:Steve Claridge

这将帮助您:

Get the children of the parent category

读取父级的所有子类别,循环结果以获取所有子类别的ID,然后在query\\u posts()调用中包含所有ID。

例如(未测试):

$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 ) ); 

结束

相关推荐

Multiple loops for plugin

好的,我正在使用插件“the Cart Press”,我试图了解使用自定义帖子类型时多个循环是如何工作的。如果我定期查询帖子,它只会返回我的博客帖子,而不是我的TCP产品。当定期显示产品时,它们使用与博客帖子相同的循环功能,因此我想知道是什么不同的情况导致这些产品被加载。我过去使用过一个名为“Simple portfolio”的公文包插件,它有一个名为Simple\\u portfolio\\u get\\u projects()的自定义函数,它只给了我一个项目数组,我希望能够对TCP产品执行同样的操作。