Как правильно вывести все посты кастомного типа, сгруппировав их по кастомной таксономии? Я уже успешно вывел таксономии, но у меня не получается вывести соответствующие посты. Необходимо, чтобы выводилась первая таксономия (категория) и под ней - все связанные с ней посты, затем вторая таксономия и её посты, и так далее. Вот мой текущий код: <br/> <br/> <pre><code class="php"><ul>
<?php
$cats = get_terms(array('taxonomy' => 'union', 'post_type' => 'city'));
foreach ($cats as $cat) { ?>
<li>
<h2>
<a href="<?php echo get_term_link($cat); ?>">
<?php echo get_field('eu-members') . '&nbsp;' . $cat->name . '&nbsp;<small>&#129122;&nbsp;' . get_field('eu-show-more') . '</small>' ?>
</a>
</h2>
<ul>
<?php
$query_city = new WP_Query('posts_per_page=-1&order=ASC&post_type=city&taxonomy=' . $cat->term_id);
while ($query_city->have_posts()) {
$query_city->the_post();
$category = get_terms(array('taxonomy' => 'union', 'post_type' => 'city'));
if ($category[0]->term_id == $cat->term_id) { ?>
<li>
<figure><?php the_post_thumbnail() ?></figure>
<div>
<span><?php the_title() ?></span>
</div>
</li>
<?php }
}
wp_reset_postdata();
?>
</ul>
</li>
<?php } ?>
</ul></code></pre>
Ваш код содержит несколько ошибок, касающихся запроса постов по кастомной таксономии. По сути, вам нужно вызвать `WP_Query`, чтобы получить посты по определенной таксономии, но вы используете неправильный параметр для этого.
Ниже приведен исправленный код, который покажет ваши кастомные посты, сгруппированные по кастомной таксономии:
```php
<ul>
<?php
$cats = get_terms(array('taxonomy' => 'union', 'hide_empty' => true)); // Получаем все термины таксономии
foreach ($cats as $cat) { ?>
<li>
<h2>
<a href="<?php echo esc_url(get_term_link($cat)); ?>">
<?php echo esc_html(get_field('eu-members') . ' ' . $cat->name . ' <small>🡢 ' . get_field('eu-show-more') . '</small>'); ?>
</a>
</h2>
<ul>
<?php
// Изменяем аргументы для WP_Query
$query_city = new WP_Query(array(
'post_type' => 'city',
'tax_query' => array(
array(
'taxonomy' => 'union',
'field' => 'term_id',
'terms' => $cat->term_id,
),
),
'posts_per_page' => -1,
'order' => 'ASC',
));
if ($query_city->have_posts()) {
while ($query_city->have_posts()) {
$query_city->the_post(); ?>
<li>
<figure><?php the_post_thumbnail(); ?></figure>
<div>
<span><?php the_title(); ?></span>
</div>
</li>
<?php }
} else {
echo '<li>' . __('Нет постов для этой категории.', 'text-domain') . '</li>';
}
wp_reset_postdata();
?>
</ul>
</li>
<?php } ?>
</ul>
```
### Объяснение исправлений:
1. **Исправление аргументов WP_Query**: В изначальном коде был неправильно указан порядок и параметры, связанные с таксономиями. Новый код использует массив `tax_query`, чтобы фильтровать посты по нужной вам таксономии и её терминам.
2. **Проверка наличия постов**: Добавлена проверка на наличие постов с соответствующей таксономией, чтобы предотвратить вывод пустых списков.
3. **Экранирование значений**: Используйте функции `esc_url()` и `esc_html()`, чтобы правильно экранировать ссылки и вывод значений, что помогает избежать возможных уязвимостей.
4. **Вывод с использованием текста по умолчанию**: Начинается с проверки наличия постов, если нет постов для данной таксономии, выводится сообщение.
Теперь этот код должен корректно отображать ваши кастомные посты, сгруппированные по вашей кастомной таксономии.
У функцииget_terms()нет аргумента post_type , а уWP_Queryаргумента taxonomy
Для проверки постов, относящихся к определенной категории нужно использоватьget_the_terms()илиhas_term()
<ul> <?php // Получаем все термины таксономии 'union' $cats = get_terms(array('taxonomy' => 'union', 'hide_empty' => false)); // Цикл по терминам таксономии foreach ($cats as $cat) { ?> <li> <h2> <a href="<?php echo get_term_link($cat); ?>"> <?php echo get_field('eu-members') . ' ' . $cat->name . ' <small>🡢 ' . get_field('eu-show-more') . '</small>' ?> </a> </h2> <ul> <?php // Создаем новый WP_Query для получения постов текущего термина $query_city = new WP_Query(array( 'posts_per_page' => -1, 'order' => 'ASC', 'post_type' => 'city', 'tax_query' => array( array( 'taxonomy' => 'union', // Таксономия 'field' => 'term_id', // Поле термина 'terms' => $cat->term_id, // ID термина ), ), )); // Проверяем наличие постов if ($query_city->have_posts()) { while ($query_city->have_posts()) { $query_city->the_post(); ?> <li> <figure><?php the_post_thumbnail(); ?></figure> <div> <span><?php the_title(); ?></span> </div> </li> <?php } } else { echo '<li>No posts found.</li>'; } // Сбрасываем данные поста wp_reset_postdata(); ?> </ul> </li> <?php } ?> </ul>