Wordpress 修改循环以排除属于某个类别而不属于其他类别的帖子

Wordpress 修改循环以排除属于某个类别而不属于其他类别的帖子,wordpress,Wordpress,在Wordpress中: 我需要从主WP循环中排除某些类别的帖子。但前提是该帖子没有其他类别 例如,如果所讨论的类别被称为X 测试1:只属于X类别的帖子将被排除在外 测试2:将包括属于X和Y类别的帖子 测试3:属于Z或Foo或任何其他内容的帖子也将被包括在内 到目前为止,我有以下代码: function exclude_category( $query ) { if ( $query->is_home() && $query->is_main_query()

在Wordpress中:

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

例如,如果所讨论的类别被称为
X

测试1:只属于
X
类别的帖子将被排除在外

测试2:将包括属于
X
Y
类别的帖子

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

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

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。如何修改查询以实现这一点?

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

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

基本上,我要求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\u 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' );

您给出了一个案例场景,我给出了消除x类中所有帖子的解决方案,因为您不理解,这并不意味着它是错误的,我猜您希望我为您编写代码