Как выбрать должности из одной категории, но исключить должности в другой категории?

Я пытаюсь выбрать сообщения, которые имеют категорию id 4 но исключают сообщения, которые также имеют идентификатор категории 2

Вот что я пытаюсь

 $query = new WP_Query(array( "cat__in" => array(4), "cat__not_in" => array(2), "post_type" => "post", "post_status" => "publish", "orderby" => "date", "order" => "DESC", "posts_per_page" => $limit, "offset" => 0 )); 

Однако это не делает правильный выбор. Что я делаю не так?

Solutions Collecting From Web of "Как выбрать должности из одной категории, но исключить должности в другой категории?"

Используйте pre_get_posts чтобы исключить категории, которые вы не хотите отображать в цикле.

 function exclude_posts_from_specific_category( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'cat', '-2' ); } } add_action( 'pre_get_posts', 'exclude_posts_from_specific_category' ); 

Или создайте новый WP_Query и используйте параметры категории.

 <?php $args = array( 'category__not_in' => 2 , 'category__in' => 4 ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_the_title() . '</li>'; } echo '</ul>'; } else { } wp_reset_postdata(); 

Если вы хотите показывать сообщения только из одной категории, вы должны использовать архив категорий. См. Template Hierarchy .

Как оказалось, это можно сделать четырьмя отдельными способами

Использование cat с отрицательным числом

 $query = new WP_Query(array( "cat" => "4, -2", // ... )); 

Использование category__in и category__not_in

Я ошибочно использовал cat__in и cat__not_in которые не являются допустимыми параметрами WP_Query

 $query = new WP_Query(array( "category__in" => array(4), "category__not_in" => array(2), // ... )); 

Использование tax_query

 $query = new WP_Query(array( "tax_query" => array( "relation" => "AND", array( "taxonomy" => "category", "field" => "term_id", "terms" => array(4) ), array( "taxonomy" => "category", "field" => "term_id", "terms" => array(2), "operator" => "NOT IN" ), ), // ... )); 

Используя фильтр pre_get_posts (как предоставлено Брэдом Далтоном)

 function exclude_posts_from_specific_category($query) { if ($query->is_home() && $query->is_main_query()) { $query->set("cat", "-2"); } } add_action("pre_get_posts", "exclude_posts_from_specific_category"); 

Предположим, у вас есть сообщения с идентификатором cat 4.

 query_posts('cat=4'); while (have_posts()) : the_post(); the_content(); endwhile;