我的主页顶部有一个部分,如果已设置,则显示某个时间段内的特色帖子;否则,它将显示某个时间段内评论最多的帖子;如果以上都不正确,则只显示最近的帖子。
然后,我在页面上还有两个循环,其中显示了6篇最近的帖子(每个帖子3篇)。
我使用以下代码来避免显示重复的帖子。
<?php
$do_not_duplicate = $post->ID;
if( $post->ID == $do_not_duplicate ) continue;
?>
这可以通过跳过与ID匹配的帖子来避免重复帖子,但是会留下一个空白,使主页看起来很奇怪。有没有办法显示下一篇不是该ID的最新帖子,而不是完全跳过它?
<div class="grid_8 main-content">
<div class="grid_12 alpha omega">
<?php
// Fetch from the \'featured\' category
$args = array(
\'posts_per_page\' => 1,
\'category_name\' => \'featured\',
\'date_query\' => array( \'after\' => \'1 day ago\' )
);
$the_query = new WP_Query( $args );
// If no featured post is found fetch the most commented
if ( 0 === $the_query->found_posts ) {
$args = array(
\'posts_per_page\' => 1,
\'orderby\' => \'comment_count\',
\'date_query\' => array( \'after\' => \'1 day ago\' )
);
$the_query = new WP_Query( $args );
}
// If no most commented posts are available fetch the most recent
if ( 0 === $the_query->found_posts ) {
$args = array(
\'posts_per_page\' => 1,
\'orderby\' => \'most_recent\'
);
$the_query = new WP_Query( $args );
}
?>
<?php if ( have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<?php $do_not_duplicate = $post->ID; ?>
<a href="<?php the_permalink();?>"><h1 class="main-heading"><?php the_title(); ?></h1></a>
<p class="meta">Published on <?php the_date(); ?> by <a href="<?php echo the_permalink();?>"><?php the_author(); ?></a><a href="<?php the_permalink();?>"> <?php comments_number(); ?></a></p>
<?php the_excerpt(); ?>
<hr>
<?php
endwhile;
wp_reset_postdata();
else:
_e(\'No posts found\');
endif; ?>
</div>
<?php
$args = array(
\'posts_per_page\' => 3,
\'orderby\' => \'most_recent\'
);
$the_query = new WP_Query( $args );
?>
<div class="recent_posts grid_6 alpha">
<?php if ( have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<?php if( $post->ID == $do_not_duplicate ) continue; ?>
<a href="<?php the_permalink();?>"><h2><?php the_title(); ?></h2></a>
<p class="meta">Published on <?php the_date(); ?> by <a href="<?php echo the_permalink();?>"><?php the_author(); ?></p></a><a href="<?php the_permalink();?>"> <?php comments_number(); ?></a></p>
<?php the_excerpt(); ?>
<hr>
<?php endwhile; else: ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
</div>
<?php
$exclude = $most_recent;
$args = array(
\'posts_per_page\' => 3,
\'orderby\' => \'most_recent\',
\'offset\' => 3
);
$the_query = new WP_Query( $args );
?>
<div class="grid_6 alpha">
<?php if ( have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<?php if( $post->ID == $do_not_duplicate ) continue; ?>
<a href="<?php the_permalink();?>"><h2><?php the_title(); ?></h2></a>
<p class="meta">Published on <?php the_date(); ?> by <a href="<?php echo the_permalink();?>"><?php the_author(); ?></p></a><a href="<?php the_permalink();?>"> <?php comments_number(); ?></a></p>
<?php the_excerpt(); ?>
<hr>
<?php endwhile; else: ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
</div>
最合适的回答,由SO网友:s_ha_dum 整理而成
我认为您的代码并没有按照您的想法执行,因为它只设置为来自您的一个循环的单个帖子。你的描述与这个逻辑并不相符。
要防止重复,需要累积ID
每个循环的s。
$do_not_duplicate[] = $post->ID;
我认为你看到的空间是你
echo
即使您的循环可能为空,也会忽略标记。要避免这种情况,请排除
$do_not_duplicate
值,并且仅当有帖子要打印时才打印标记。
第一个是用post__not_in
论点后者是通过将“包装器”div放入have_posts()
检查而且它有助于具有可读的代码格式。例如:
if ( $the_query->have_posts() ) { ?>
<div class="grid_6 alpha"><?php
while ( $the_query->have_posts() ) :
$the_query->the_post();
$do_not_duplicate[] = $post->ID; ?>
<a href="<?php the_permalink();?>"><h2><?php the_title(); ?></h2></a>
<p class="meta">Published on <?php the_date(); ?> by <a href="<?php echo the_permalink();?>"><?php the_author(); ?></p></a><a href="<?php the_permalink();?>"> <?php comments_number(); ?></a></p>
<?php the_excerpt(); ?>
<hr><?php
} ?>
</div><?php
}
注意:您使用的是裸机
have_posts()
在
if
条件,假设
$wp_query
不是您创建的查询。这可能会导致你的问题。
我还注意到您有一个日期查询。这应该是一个数组的数组。即:
\'date_query\' => array(array( \'after\' => \'1 day ago\' ))
而不是这样:
\'date_query\' => array( \'after\' => \'1 day ago\' )