Как вывести записи текущего термина произвольной таксономии WordPress?

Ссылка скопирована
1 ответ

Ситуация следующая:

Фрагмент кода, выводящий посты, вывел в отдельный 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.

Прошу прощения у всех оскорбленных тупостью вопроса и очевидностью решения. Всем повезло родиться готовыми программистам, а вот мне - увы.

Дополнительно:

а разве стандартное поведение при заходе на страницу таксономии не такое? т.е. если не перебивать запрос своим?

Как вывести записи текущего термина произвольной таксономии WordPress?

Записи текущего термина произвольной таксономии уже находятся в global $wp_query->posts, вам не нужно создавать свой собственный экземпляр запроса WP_Query()

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь NetOps Ответ

Для произвольной таксономии нельзя использовать только 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,
        ],
    ],
]);

$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);

$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')),
]);

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 у основного запроса или в том, что пагинация считает страницы одного запроса, а выводит записи другого.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно