This is the code I've been using, with the preceding query parameters excluded for brevity. As you can see, this comes from a widget that displays a grid of posts. The problem is that I can't figure out how to write a query, or multiple queries, that will retrieve the latest post from each of the six categories in a way that works. $r = new WP_Query( apply_filters( 'widget_posts_grid', $query ) ); if ( $r->have_posts() ) : ?> <?php echo wp_kses_post( $args['before_widget'] ); ?> <?php if ( $title ) { echo wp_kses_post( $args['before_title'] . $title . $args['after_title'] ); } ?> <div class="posts-grid"> <div class="row"> <?php while ( $r->have_posts() ) : $r->the_post(); ?> <div class="col-md-4 col-sm-6"> <?php get_template_part( 'content', get_post_format() ); ?> </div> <?php endwhile; ?> </div> </div> <?php echo wp_kses_post( $args['after_widget'] ); ?> <?php wp_reset_postdata(); endif; I have tried a foreach loop with array_merge, but the result apparently can't be looped through... $do_not_duplicate = array(); $r = new WP_Query(); $categories = get_categories(); foreach ( $categories as $category ) { $args = array( 'cat' => $category->term_id, 'post_type' => 'post', 'posts_per_page' => '1', 'post__not_in' => $do_not_duplicate ); $little_array = new WP_Query( $args ); $r = array_merge( $r, $little_array->posts ); while ( $r->have_posts() ) { $r->the_post(); $do_not_duplicate[] = $post->ID; } } $r->post_count = count( $r->posts ); for($i = 1; $r->have_posts(); $i++) { $r->the_post(); } if ( $r->have_posts() ) : From my research, I really thought this would work. However, it seems that after `$r = array_merge( $r, $little_array->posts );`, `$r` comes up empty. `print_r($r);` prints nothing. I appreciate the help.