在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。如何修改查询以实现此目的?
答案 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中包含的所有帖子。