不复制$POST->ID会留下空格。

时间:2014-03-27 作者:chap

我的主页顶部有一个部分,如果已设置,则显示某个时间段内的特色帖子;否则,它将显示某个时间段内评论最多的帖子;如果以上都不正确,则只显示最近的帖子。

然后,我在页面上还有两个循环,其中显示了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>

1 个回复
最合适的回答,由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\' )

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post