Не дублирование $ post-> ID оставляет пустое пространство.

На моей домашней странице есть раздел вверху, на котором отображается назначенная запись с временным периодом, если она была установлена, в противном случае она отображает самую прокомментированную запись временного периода или просто отображает самую последнюю запись, если ни одна из перечисленных выше не является правда.

Затем у меня есть еще две петли на странице, которые отображают 6 самых сообщений (3 каждый).

Я использую следующий код, чтобы избежать отображения повторяющихся сообщений.

<?php $do_not_duplicate = $post->ID; if( $post->ID == $do_not_duplicate ) continue; ?> 

Это позволяет избежать дублирования сообщений, пропуская сообщение, которое соответствует идентификатору, однако оно оставляет пустое пространство, которое делает домашнюю страницу нечетной. Есть ли способ отобразить следующую самую последнюю запись, которая не является идентификатором, а не полностью ее пропускать?

 <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> 

Я не думаю, что ваш код делает то, что вы думаете, поскольку он только когда-либо установлен на одну запись из одного из ваших циклов. Ваше описание не соответствует этой логике.

Чтобы предотвратить дублирование, вам необходимо собрать массив ID с каждым циклом.

 $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 } 

Примечание. В условии if вы использовали голый have_posts() , который предполагает $wp_query не запрос, который вы создали. Это может повлиять на вашу проблему.

Я также заметил, что у вас есть запрос на дату. Это должен быть массив массивов. То есть, это:

 'date_query' => array(array( 'after' => '1 day ago' )) 

Вместо этого:

 'date_query' => array( 'after' => '1 day ago' )