Question

I have two loops on custom page, I want from the second loop to omit the post with Post ID from the first loop (of course show all other posts from category 36).

Edit: this is the whole code in the php file:

<?php
global $udesign_options;

// construct an array of portfolio categories
$portfolio_categories_array = explode( ',', $udesign_options['portfolio_categories'] );

if ( $portfolio_categories_array != "" && post_is_in_category_or_descendants( $portfolio_categories_array ) ) :
// Test if this Post is assigned to the Portfolio category or any descendant and switch the single's template accordingly
include 'single-Portfolio.php';
else : // Continue with normal Loop (Blog category)

get_header();

$content_position = ( $udesign_options['blog_sidebar'] == 'left' ) ? 'grid_16 push_8' : 'grid_16';
if ( $udesign_options['remove_single_sidebar'] == 'yes' ) $content_position = 'grid_24';
?>
<div id="content-container" class="container_24">
<div id="main-content" class="<?php echo $content_position; ?>">
    <div class="main-content-padding">
<?php if (have_posts()) :
        while (have_posts()) : the_post(); ?>
        <div <?php post_class() ?> id="post-<?php the_ID(); ?>">
            <div class="entry" style="margin:-30px 0 00px 0;">
<?php                           // Post Image
                            if( $udesign_options['display_post_image_in_single_post'] == 'yes' ) display_post_image_fn( $post->ID, false );
            the_content(__('<p class="serif">Read the rest of this entry &raquo;</p>', 'udesign'));
            wp_link_pages(array('before' => '<p><strong>Pages:</strong> ', 'after' => '</p>', 'next_or_number' => 'number')); ?>


            </div>


<?php
$args = array( 'category' => 36, 'post_type' =>  'post' ); 
$postslist = get_posts( $args );    
foreach ($postslist as $post) :  setup_postdata($post); 
?>     
<h2><?php the_title(); ?></h2> 
<?php the_content(); ?> 
<?php echo do_shortcode('[divider_top]'); ?>
<?php endforeach; ?> 



<div><?php comments_template();
        endwhile; else: ?>
        <p><?php esc_html_e("Sorry, no posts matched your criteria.", 'udesign'); ?></p>
<?php endif; ?></div>
    </div><!-- end main-content-padding -->
</div><!-- end main-content -->

<?php
if( ( !$udesign_options['remove_single_sidebar'] == 'yes' ) && sidebar_exist('BlogSidebar') ) { get_sidebar('BlogSidebar'); }
?>

</div><!-- end content-container -->
<?php endif; // end normal Loop ?>

<div class="clear"></div>

<?php get_footer(); ?>

I figured it out, this code needs to be inserted $args = array('exclude' =>theExcludedID, 'category' => 36, 'post_type' => 'post' );

Was it helpful?

Solution

According to the question's update, it seems the first loop displays all categories in portfolio_categories from a custom query, most probably including those from category 36 also.

The only way I can think off to not repeat the posts in the second loop is to exclude all category 36 posts from the first loop.

I can't test the code, but here is an idea of how to do it:

Add 3 lines of code after the Loop, like this:

if (have_posts()) : while (have_posts()) : the_post(); // This is the Loop
$Category =  get_the_category( $post->ID );
$CatID = $Category[0]->cat_ID ; // The 0 assumes the post has only one category. If there are more, the number must be changed accordingly.
if ($CatID == 36) continue;

OTHER TIPS

Use the following at the top of your loop:

if(get_the_ID() == theExcludedID){
    continue;
}

To skip any iteration.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top