Как правильно вывести все посты кастомного типа, сгруппировав их по кастомной таксономии? Я уже успешно вывел таксономии, но у меня не получается вывести соответствующие посты. Необходимо, чтобы выводилась первая таксономия (категория) и под ней - все связанные с ней посты, затем вторая таксономия и её посты, и так далее. Вот мой текущий код: <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>