修改循环以排除属于某个类别且没有其他类别的帖子

时间:2018-11-14 21:09:32

标签: wordpress

在Wordpress中:

我需要从WP主循环中排除某些类别的帖子。但前提是该帖子没有其他类别。

例如,如果所涉及的类别称为X ...

测试1:仅属于X类别的帖子将被排除。

测试2:将包括属于XY类别的帖子。

测试3:属于ZFoo或其他任何内容的帖子也将包括在内。

到目前为止,我有以下代码:

function exclude_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
    $query->set( 'cat', '-271' );
    }
}

add_action( 'pre_get_posts', 'exclude_category' );

但这适用于测试1和3(以上),但不适用于测试2。如何修改查询以实现此目的?

2 个答案:

答案 0 :(得分:0)

我想出了一种方法来做到这一点,尽管我不确定这是最好的方法。

基本上,我是在向WP请求所有类别的列表,然后将那些类别的列表减去我要排除的类别串联在一起。然后,将其输入到WP查询中的“ cat”参数中。它似乎按我希望的那样工作,但似乎也有些绕来绕去。我将不胜感激任何反馈。

在这种情况下,271是我的x类别的ID。

function exclude_category( $query ) {

    $terms = get_terms( array(
        'taxonomy' => 'category',
        'hide_empty' => false,
    ) );

    $catquery = "";
    foreach($terms as $term) {
        if($term->term_id != 271) {
            $catquery .= $term->term_id . ",";
        }
    }

    $catquery = substr($catquery, 0, -1);

    if ( $query->is_home() && $query->is_main_query() ) {
         $query->set( 'cat',  $catquery  );
    }
}

add_action( 'pre_get_posts', 'exclude_category' );

编辑

我最终将其更改为分类查询,因此可以将include_children设置为false。

function exclude_category( $query ) {

    $terms = get_terms( array(
        'taxonomy' => 'category',
        'hide_empty' => false,
    ) );

    $catarray = [];
    foreach($terms as $term) {
        if($term->term_id != 271) {
            array_push($catarray, $term->term_id);
        }
    }

    if ( $query->is_main_query() &&  $query->is_home()) {
         $query->set( 'tax_query', array(  array(
             'taxonomy' => 'category',
             'field' => 'term_id',
             'terms' => $catarray,
             'include_children' => false
            )));
    }
}

add_action( 'pre_get_posts', 'exclude_category' );

答案 1 :(得分:-1)

我假设包括所有类别y,将包括x和y中包含的所有帖子。