1

I'm trying to show my CPT Category along with any posts associated with it below the title. I have the first loop fine:

<?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; ?>

But my second loop queries all my posts instead of just the ones from that category. I've tried get_posts() and instead of pulling all posts it didn't pull any. I'm not sure if 'category' in the codex is expecting a string, slug, or ID, but I've tried all 3. Anyway how do I edit my query to only pull posts from that certain category?

1

To expand on the answer from @s_ha_dum - you need to modify a few things about your query.

First, use his suggested tax query:

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

Then, modify your code as follows:

$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; ?>

Note a few things:

  1. You must use while ($cat_posts->have_posts) to iterate over the posts.
  2. Call cat_posts->the_post() to prepare the data to be displayed in the functions such as get_the_title()
  3. When referencing post variables, such as ID, you must do so as $cat_posts->post->ID
  4. When calling functions such as get_the_title(), you do not need to pass the ID in.
2

You need a tax_query and what you have is not that.

$cat_posts = new WP_Query(
  array(
    'post_type' => 'custcpt', 
    'tax_query' => array(
      array(
        'taxonomy' => 'custtax', 
        'field' => 'id',
        'terms' => $cat->term_id,
      )
    ), 
    'order' => 'ASC'
  )
);
  • Still not pulling any posts, but i'll keep playing around with it – Howdy_McGee Oct 17 '13 at 19:21
  • 1
    @Howdy_McGee probably because you can't loop over a WP_Query object with foreach, it's an object not an array. – Milo Oct 17 '13 at 19:30
  • @Milo so is get_posts() a better option then? – Howdy_McGee Oct 17 '13 at 19:31
  • @Howdy_McGee you can use WP_Query, you just need a loop: while( $cat_posts->have_posts() ): $cat_posts->the_post(), etc.. – Milo Oct 17 '13 at 19:36
  • @Howdy_McGee : I rarely use anything but WP_Query. – s_ha_dum Oct 17 '13 at 19:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.