Support » Plugins » Hacks » Exclude posts from first loop in second loop

  • Hi,

    I’ve created a related posts function for the end of my single.php that has 2 loops. The first loop displays related posts by tag and then if there’s not enough of those then the second loop kicks in and displays some recent posts from the same category.

    The idea is that i always want to show 4 related posts but i haven’t always got enough related by tag so when that happens i display a few from the same category to pad it out.

    Both loops exclude the current post id, however, the problem i have is that it is possible for a post to be returned in the first tag loop and the second by-category loop, so i end up with 2 of the same in the related posts

    What I want to do is exclude any posts returned in the first by-tag loop from the second by-category loop.

    I’ve been trying to implement something this solution but not much luck

    Here’s my code:

            $orig_post = $post;
            global $post;
            $tags = wp_get_post_tags($post->ID);
             $max_articles = 4;  // How many articles to display
    		 $cnt = 0;
            if ($tags) {
           	 $tag_ids = array();
           	 foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id;
            'tag__in' => $tag_ids,
            'post__not_in' => array($post->ID),
            'posts_per_page'=> $max_articles, // Number of related posts to display.
            'caller_get_posts'=>1 ,
    		'tag__not_in' => array('480'),
    		'orderby' => 'date',
    		'order' => 'DESC'
            $my_query = new wp_query( $args );
    	$exclude_featured = array();
            while( $my_query->have_posts() ) {
    		$exclude_featured = $post->ID;
            ?> <?php the_title(); ?>  	
            <? }
            $post = $orig_post;  
             if ($cnt < $max_articles) {
    		'category_name' => $category[0]->cat_name,
            'post__not_in' =>  array($post->ID),
            'post__not_in' =>  array($exclude_featured)
           $mergeblah = array_merge( $args, $blah );
            $relQuery = new WP_query( $mergeblah );  
    		if($relQuery->have_posts()) : 
    		while($relQuery->have_posts()) : $relQuery->the_post();
                    if ($cnt > $max_articles) break;
    		        <?php the_title(); ?>
    		else :
    			//do nothing

    Any pointers much appreciated.



Viewing 5 replies - 1 through 5 (of 5 total)
  • Michael


    Forum Moderator

    the Codex has some examples:

    start with changing this line:
    $exclude_featured = $post->ID;

    $exclude_featured[] = $post->ID;

    Hi alchymyth,

    Thanks for the reply.

    I just gave that a try but no change to the output..


    Moderator bcworkz


    When you define the fill in query and array merge the existing related posts, the merge overwrites the initial value of the presumably main post ID. Except it is not the main post ID at this point, it is the last post in the related loop. To include the main post in the exclusion array, it’s probably easiest to include the ID when the exclusion array is first initialized. In other words, instead of:
    $exclude_featured = array();
    do this:
    $exclude_featured = array( $post->ID );

    Then get rid of the array merge, define 'post__not_in' => $exclude_featured straight away. Do not place it in an array, it is an array already. I don’t think ‘post__not_in’ can deal with nested arrays.

    If you still have trouble, repost your latest code and describe exactly how it is not working right.

    Hey bc,

    That works a treat – thanks!

    So essentially, we’ve grabbed the current post ID, put it in the array exclude_featured and then inserted the post ID’s from the first loop in exclude_featured as well.

    Then in the second loop exclude everything in exclude_featured

    Have I got that right?



    Moderator bcworkz


    Exactly! You had the right idea all along, it’s just that you weren’t collecting the IDs in a sustainable manner.

Viewing 5 replies - 1 through 5 (of 5 total)
  • The topic ‘Exclude posts from first loop in second loop’ is closed to new replies.