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

Я пытаюсь выбрать сообщения, которые имеют идентификатор категории 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
));

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

2
14.07.2014, 12:12
3 ответа

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

Используя 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 фильтр (в соответствии с Brad Dalton)

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");
1
19.02.2020, 22:38

Использовать 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.

1
19.02.2020, 22:38
  • 1
    , который был моей проблемой. Я использовал cat__in и cat__not_in. Я должен был использовать полное слово category в каждом параметре. Я собираюсь переделать Ваш другой метод, также. –   14.07.2014, 21:05
  • 2
    я отредактировал свой ответ для составления полного (?) списка методов, чтобы сделать это. –   14.07.2014, 21:34
  • 3
    Это - большой @naomik. Вы также тестировали свой код также? –  Brad Dalton 15.07.2014, 00:22
  • 4
    Вы имеете в виду модульные тесты? Я просто выполнил быстрое испытание с помощью дыма, чтобы видеть, что каждый метод в моем сообщении работает. –   15.07.2014, 02:38
  • 5
    Позволяет оставляют комментарий здесь как его перетаскивание немного, но я просто предлагаю, чтобы Вы протестировали все фрагменты кода в своей теме. –  Brad Dalton 15.07.2014, 11:23

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

query_posts('cat=4');
  while (have_posts()) : the_post();
      the_content();
  endwhile;
-2
19.02.2020, 22:38
  • 1
    Добавьте объяснение к своему ответу: почему это решило бы проблему? –  fuxia♦ 14.07.2014, 12:23
  • 2
    Вы никогда не должны использовать query_posts, никогда причина –  Pieter Goosen 14.07.2014, 13:04
  • 3
    того, что никогда не использовался query_posts? –  jojo 14.07.2014, 13:27
  • 4
    Это сообщение должно пролить некоторый свет на это –  Pieter Goosen 14.07.2014, 13:49

Теги

Похожие вопросы