Запрос терминов в цикле

Я пытаюсь показать свою категорию CPT вместе с любыми сообщениями, связанными с ней под заголовком. У меня есть первая петля:

<?php $cats = get_categories(array('taxonomy' => 'custtax', 'orderby' => 'term_group')); if(!empty($cats)) : foreach($cats as $cat) : ?> <a href="<?php echo get_category_link($cat->term_id); ?>"><?php echo $cat->name; ?></a> <br /> <?php wp_reset_query(); ?> <?php $cat_posts = new WP_Query(array('post_type' => 'custcpt', 'taxonomy' => 'custtax', 'terms' => $cat->slug, 'order' => 'ASC')); foreach($cat_posts as $cat_post) : ?> <center><?php get_the_post_thumbnail($cat_post->ID, 'thumbnail'); ?></center> <br /> <a href="<?php get_permalink($cat_post->ID); ?>"><?php get_the_title($cat_post->ID); ?></a> <br /> <br /> <?php endforeach; ?> <?php endforeach; ?> <?php endif; ?> 

Но мой второй цикл запрашивает все мои сообщения, а не только те из этой категории. Я пробовал get_posts() и вместо того, чтобы тянуть все сообщения, он не тянул. Я не уверен, что 'category' в кодексе ожидает строку, slug или ID, но я пробовал все 3. В любом случае, как мне изменить свой запрос, чтобы вытащить сообщения из этой определенной категории?

Solutions Collecting From Web of "Запрос терминов в цикле"

Чтобы расширить ответ от @s_ha_dum – вам нужно изменить несколько вещей о вашем запросе.

Сначала воспользуйтесь предложенным налоговым запросом:

 $args = array( 'post_type' => 'custcpt', 'tax_query' => array( array( 'taxonomy' => 'custtax', 'field' => 'id', 'terms' => $cat->term_id, ) ), 'order' => 'ASC' ); 

Затем измените свой код следующим образом:

 $cat_posts = new WP_Query($args); while ($cat_posts->have_posts()) : $cat_posts->the_post(); // Below, when referencing the post variables, must be as $cat_post->post->ID, etc. ?> <center><?php get_the_post_thumbnail($cat_post->post->ID, 'thumbnail'); ?></center> <br /> <?php // Below, don't need to pass the post ID into these functions. ?> <a href="<?php get_permalink(); ?>"><?php get_the_title(); ?></a> <br /> <br /> <?php endwhile; ?> <?php endif; ?> 

Обратите внимание на несколько вещей:

  1. Вы должны использовать while ($cat_posts->have_posts) для перебора сообщений.
  2. Вызовите cat_posts->the_post() чтобы подготовить данные для отображения в таких функциях, как get_the_title()
  3. При ссылке на пост-переменные, такие как идентификатор, вы должны сделать это как $cat_posts->post->ID
  4. При вызове функций, таких как get_the_title() , вам не нужно передавать идентификатор.

Вам нужен tax_query а то, что у вас есть, не так.

 $cat_posts = new WP_Query( array( 'post_type' => 'custcpt', 'tax_query' => array( array( 'taxonomy' => 'custtax', 'field' => 'id', 'terms' => $cat->term_id, ) ), 'order' => 'ASC' ) );