Как вывести записи текущего термина произвольной таксономии WordPress?
Ситуация следующая:
Фрагмент кода, выводящий посты, вывел в отдельный template_part и вызываю его в файлах category.php, tag.php и taxonomy-{имя_таксономии}.php. Выглядит он следующим образом:
<?php global $wp_query; $wp_query = new WP_Query( [ 'cat' => get_query_var('cat'), 'tag' => get_query_var('tag'), 'posts_per_page' => 12, 'orderby' => 'date', 'paged' => get_query_var('paged') ?: 1, ] ); if ( $wp_query->have_posts() ) { while ( $wp_query->have_posts() ) { $wp_query->the_post(); ?> // Здесь сам пост <?php } } else { echo 'Записей нет'; } wp_reset_postdata(); ?> |
<?php global $wp_query; $wp_query = new WP_Query( [ 'cat' => get_query_var('cat'), 'tag' => get_query_var('tag'), 'posts_per_page' => 12, 'orderby' => 'date', 'paged' => get_query_var('paged') ?: 1, ] ); if ( $wp_query->have_posts() ) { while ( $wp_query->have_posts() ) { $wp_query->the_post(); ?> // Здесь сам пост <?php } } else { echo 'Записей нет'; } wp_reset_postdata(); ?>
С выводом постов отдельных рубрик и тегов проблем нет. Все выводится как надо. При открытии страницы произвольной таксономии просто выводятся все посты, имеющиеся на сайте. Пробовал в WP_Query вписывать следующее:
'tax_query' => [ 'post_type' => 'post', 'taxonomy' => 'my_tax_name', 'field' => 'name', 'tems' => single_term_title() ] |
'tax_query' => [ 'post_type' => 'post', 'taxonomy' => 'my_tax_name', 'field' => 'name', 'tems' => single_term_title() ]
Наверное выглядит тупо, но я надеялся, что прокатит. Помогите сочинить запрос так, чтобы на странице site.ru/my-taxonomy/current-term выводились посты current-term.
Прошу прощения у всех оскорбленных тупостью вопроса и очевидностью решения. Всем повезло родиться готовыми программистам, а вот мне - увы.
Дополнительно:
а разве стандартное поведение при заходе на страницу таксономии не такое? т.е. если не перебивать запрос своим?
Записи текущего термина произвольной таксономии уже находятся в global $wp_query->posts, вам не нужно создавать свой собственный экземпляр запроса WP_Query()
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для произвольной таксономии нельзя использовать только
catиtag. Эти параметры относятся к стандартным рубрикам и меткам. На страницеtaxonomy-my_tax_name.phpнужно получить текущий термин черезget_queried_object()и передать его вtax_query.Пример:
$term = get_queried_object(); $paged = max(1, get_query_var('paged')); $query = new WP_Query([ 'post_type' => 'post', 'posts_per_page' => 12, 'paged' => $paged, 'tax_query' => [ [ 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, ], ], ]);
В Вашей попытке были ошибки:
post_typeнельзя класть внутрьtax_query, ключ должен бытьterms, а неtems, и лучше использоватьterm_id, а неsingle_term_title().Если template part используется и для category, и для tag, и для custom taxonomy, можно сделать универсально:
$queried = get_queried_object(); $args = [ 'post_type' => 'post', 'posts_per_page' => 12, 'paged' => max(1, get_query_var('paged')), ]; if ($queried instanceof WP_Term) { $args['tax_query'] = [[ 'taxonomy' => $queried->taxonomy, 'field' => 'term_id', 'terms' => $queried->term_id, ]]; } $query = new WP_Query($args);
Если записи у произвольной таксономии относятся не к
post, а к другому типу записи, обязательно заменитеpost_typeна нужный. Например, если таксономия привязана кproductилиportfolio, запрос поpostбудет давать неправильный результат или пустую выдачу.Пагинацию тоже лучше строить от локального запроса, а не от глобального:
echo paginate_links([ 'total' => $query->max_num_pages, 'current' => max(1, get_query_var('paged')), ]);
И ещё: не перезаписывайте глобальный
$wp_queryбез необходимости. Для собственного цикла используйте локальную переменную$query. Так Вы не сломаете пагинацию, breadcrumbs и другие части шаблона.Если задача именно изменить архив текущей таксономии, а не вывести дополнительный блок внутри страницы, ещё надёжнее вообще не создавать второй запрос. Измените основной запрос через
pre_get_posts: тогда WordPress сам сохранит правильный URL, canonical, пагинацию и хлебные крошки. НовыйWP_Queryнужен только для отдельного списка внутри шаблона.После изменений проверьте две вещи: открывается ли первая страница архива термина и работает ли
/page/2/. Если первая страница есть, а вторая даёт 404, почти всегда проблема в конфликте rewrite rules, неверномposts_per_pageу основного запроса или в том, что пагинация считает страницы одного запроса, а выводит записи другого.