Wordpress: Как я могу исключить сообщения в дочерних таксономиях из пользовательского запроса таксономии?

Моя тема WordPress имеет настраиваемую таксономию под названием «Коллекции». Пользовательская таксономия является иерархической, поэтому есть вложенные коллекции.

У меня есть сборник под названием «Книги» и под-сборник под названием «Романы». Некоторые сообщения находятся только в «Книгах», а некоторые - в «Романах». Я хочу, чтобы на странице коллекции «Книги» отображались только сообщения из основной коллекции «Книги», а не сообщения из вложенной коллекции «Романы». Но по умолчанию WordPress включает сообщения в «подколлекции» в запросе таксономии.

Как мне исключить сообщения в дочерних терминах из моего запроса таксономии? С категориями это легко сделать, но, похоже, нет встроенного способа сделать это с пользовательскими таксономиями.


Обновление: решение Яна сработало отлично. Вот код, который я использовал, размещенный над циклом в index.php:

// if is taxonomy query for 'collections' taxonomy, modify query so only posts in that collection (not posts in subcollections) are shown.
if (is_tax()) {
 if (get_query_var('collection')) {
  $taxonomy_term_id = $wp_query->queried_object_id;
  $taxonomy = 'collection';
  $unwanted_children = get_term_children($taxonomy_term_id, $taxonomy);
  $unwanted_post_ids = get_objects_in_term($unwanted_children, $taxonomy);

  // merge with original query to preserve pagination, etc.
  query_posts( array_merge( array('post__not_in' => $unwanted_post_ids), $wp_query->query) );
 }
}

person shipshape    schedule 10.08.2010    source источник


Ответы (1)


Кажется, что класс WP_Query всегда включает все элементы иерархические таксономии. Если вы хотите противостоять этому, вы можете использовать тот же трюк, который они используют: получить все подэлементы вашего элемента таксономии, затем получить все идентификаторы сообщений в этих подэлементах, а затем поместить их в параметр post__not_in:

$unwanted_children = get_term_children($taxonomy_term_id, $taxonomy);
$unwanted_post_ids = get_objects_in_term($unwanted_children, $taxonomy);

Это приведет к запросу с AND posts.ID IN (1, 2, 3) AND posts.ID NOT IN (2, 3), который вернет только это сообщение с ID 1. Очень нелегко, но это работает.

Конечно, если вы пойдете по этому пути, вы также можете просто передать идентификатор сообщения, который хотите, и ничего не сказать запросу о таксономии.

Как вы это делаете для категорий? Код запроса, похоже, также включает в себя детей.

person Jan Fabry    schedule 10.08.2010
comment
Спасибо, это сработало отлично! С категориями вы можете использовать параметр category__in, который не включает сообщения в дочерних категориях. К сожалению, Wordpress еще не имеет эквивалентного параметра для иерархической настраиваемой таксономии. - person shipshape; 11.08.2010