Как можно отобразить свои собственные категории и записи в цикле?

Как правильно вывести все посты кастомного типа, сгруппировав их по кастомной таксономии? Я уже успешно вывел таксономии, но у меня не получается вывести соответствующие посты. Необходимо, чтобы выводилась первая таксономия (категория) и под ней - все связанные с ней посты, затем вторая таксономия и её посты, и так далее. Вот мой текущий код: <br/> <br/> <pre><code class="php">&lt;ul&gt;
	&lt;?php
	$cats = get_terms(array('taxonomy' =&gt; 'union', 'post_type' =&gt; 'city'));
	foreach ($cats as $cat) { ?&gt;
		&lt;li&gt;
			&lt;h2&gt;
				&lt;a href="&lt;?php echo get_term_link($cat); ?&gt;"&gt;
					&lt;?php echo get_field('eu-members') . '&amp;nbsp;' . $cat-&gt;name . '&amp;nbsp;&lt;small&gt;&amp;#129122;&amp;nbsp;' . get_field('eu-show-more') . '&lt;/small&gt;' ?&gt;
				&lt;/a&gt;
			&lt;/h2&gt;

			&lt;ul&gt;
				&lt;?php
				$query_city = new WP_Query('posts_per_page=-1&amp;order=ASC&amp;post_type=city&amp;taxonomy=' . $cat-&gt;term_id);
				while ($query_city-&gt;have_posts()) {
					$query_city-&gt;the_post();
					$category = get_terms(array('taxonomy' =&gt; 'union', 'post_type' =&gt; 'city'));
					if ($category[0]-&gt;term_id == $cat-&gt;term_id) { ?&gt;
						&lt;li&gt;
							&lt;figure&gt;&lt;?php the_post_thumbnail() ?&gt;&lt;/figure&gt;
							&lt;div&gt;
								&lt;span&gt;&lt;?php the_title() ?&gt;&lt;/span&gt;
							&lt;/div&gt;
						&lt;/li&gt;
				&lt;?php }
				}
				wp_reset_postdata();
				?&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
	&lt;?php } ?&gt;
&lt;/ul&gt;</code></pre>
  • 22 сентября 2024 г. 21:33
Ответы на вопрос 2
Ваш код содержит несколько ошибок, касающихся запроса постов по кастомной таксономии. По сути, вам нужно вызвать `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>&#129122; ' . 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') . '&nbsp;' . $cat->name . '&nbsp;<small>&#129122;&nbsp;' . 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>
Похожие вопросы