Вопрос или проблема
Я делаю запрос к пользовательскому типу записи (“донор”) и хотел бы сгруппировать их по категориям (пользовательская таксономия для этого типа записи), при этом отображая название категории, а затем все записи для этой категории.
После долгих исследований у меня есть следующий код (в шаблоне архива моего пользовательского типа записи, archive-donor.php):
global $paged;
global $query_args;
$category_args = array(
'taxonomy' => 'donor_taxonomy',
'orderby' => 'name',
'parent' => 0
);
$categories = get_categories( $category_args );
foreach ( $categories as $category ) {
echo '<h3><a href="' . get_category_link( $category->term_id ) . '">' . $category->name . '</a></h3>';
echo 'ID: ' . $category->term_id . '. ';
$post_args = array(
'cat' => $category->term_id,
'post_type' => 'donor',
'orderby' => 'post_date',
'posts_per_page'=> '-1', // переопределяет количество постов на странице в настройках темы
);
$loop = new WP_Query( $post_args );
if( $loop->have_posts() ) {
[вставьте здесь запрос, который работает нормально, если я НЕ пытаюсь указать категорию в своих аргументах запроса]
}
wp_reset_postdata();
}
Хотя я могу вывести номер ID с помощью этой строки…
echo 'ID: ' . $category->term_id . '. ';
…если я включаю следующее в свои $post_args, которое использует тот же код для получения ID, система сообщает, что записи не найдены:
'cat' => $category->term_id
Если я убираю эту строку, я получаю все записи, независимо от категории, которые отображаются после каждого заголовка категории. Если я включаю ее, то после каждого заголовка появляется сообщение “записи не найдены”. Заголовки отображаются правильно в порядке.
Наверняка я делаю что-то не так, но не могу понять, что именно. Надеюсь, кто-то сможет помочь! 8^)
Вы упомянули, что используете пользовательскую таксономию – поэтому включение ключа cat
в ваши аргументы wp_query не сработает. wp_query ожидает, что это будет ID термина, относящегося к стандартной WP категории. С пользовательской таксономией вам нужно использовать специальные параметры таксономии.
Поэтому ваши аргументы должны выглядеть следующим образом:
$post_args = array(
'post_type' => 'donor',
'orderby' => 'post_date',
'posts_per_page'=> '-1', // переопределяет количество постов на странице в настройках темы
'tax_query' => array(
array(
'taxonomy' => 'donor_taxonomy',
'field' => 'term_id',
'terms' => $category->term_id,
),
)
);
Ответ или решение
Проблема, с которой вы столкнулись, связана с неверным использованием параметров при описании WP_Query для кастомного таксономического термина. Так как вы используете пользовательскую таксономию (donor_taxonomy
), вам не следует использовать параметр cat
, так как он предназначен только для стандартной таксономии категорий WordPress.
Чтобы корректно отфильтровать ваши посты по пользовательской таксономии, вам нужно использовать tax_query
. Ваш обновленный код для запроса должен выглядеть следующим образом:
global $paged;
global $query_args;
$category_args = array(
'taxonomy' => 'donor_taxonomy',
'orderby' => 'name',
'parent' => 0
);
$categories = get_categories($category_args);
foreach ($categories as $category) {
echo '<h3><a href="' . get_category_link($category->term_id) . '">' . $category->name . '</a></h3>';
echo 'ID is: ' . $category->term_id . '. ';
$post_args = array(
'post_type' => 'donor',
'orderby' => 'post_date',
'posts_per_page' => '-1', // переопределяет количество постов в настройках темы
'tax_query' => array(
array(
'taxonomy' => 'donor_taxonomy',
'field' => 'term_id',
'terms' => $category->term_id,
),
)
);
$loop = new WP_Query($post_args);
if ($loop->have_posts()) {
while ($loop->have_posts()) {
$loop->the_post();
// Здесь выводите ваши посты, например:
the_title('<h4>', '</h4>'); // Заголовок поста
}
} else {
echo 'Посты не найдены в этой категории.';
}
wp_reset_postdata();
}
Обратите внимание на следующие изменения:
- Заменили
'cat' => $category->term_id
на параметрыtax_query
, что позволяет фильтровать посты по вашей кастомной таксономии. - Добавили цикл
while ($loop->have_posts())
для вывода самих постов внутри каждой категории. - Опционально добавили сообщение, если не найдено постов для данной категории.
После внесения этих изменений ваш код должен корректно отображать все посты по категориям, группируя их по пользовательской таксономии.