«Скоро появятся» записи блога-заполнителя?

У меня есть страница с шестью сообщениями на страницу с двумя строками из трех сообщений. Если у меня будет только один пост, я бы хотел, чтобы остальные пять имели «образы заполнителей», позволяя зрителям знать, что придет больше сообщений. Вид вроде этого:

введите описание изображения здесь

Я бы создал образы заметок, чтобы их можно было разместить там.

Вот как мой блог настроен. Довольно простой. Кто-нибудь когда-либо делал что-то подобное раньше?

<div id="article-list"> <?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <div class="post-info"> <?php the_title( sprintf( '<h1 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h1>' ); ?> <?php mobile_mix_posted_on(); ?> </div> <?php if ( '' != get_the_post_thumbnail() ) { the_post_thumbnail(); } ?> </article><!-- #post-## --> <?php endwhile; ?> <?php mobile_mix_paging_nav(); ?> <?php else : ?> <?php get_template_part( 'content', 'none' ); ?> <?php endif; ?> </div> 

Вы можете добавить фильтр в 'loop_start' , подсчитать, как у вас есть сообщения, и ввести необходимое количество «поддельных» сообщений, которые имеют значение WP_Post не имеющих ссылки в БД.

 add_filter( 'loop_start', function( $query ) { $module = $query->post_count % 6; $to_fill = $module === 0 ? 0 : 6 - $module ; if ( (int) $query->post_count === 0 || (int) $to_fill === 0 || ! $query->is_main_query() || $query->is_singular() // probably you need to put other conditions here eg $query->is_front_page() // to affect only specific pages and not all... ) { return; } $query->post_count += $to_fill; $query->found_posts += $to_fill; $fake = clone $query->posts[0]; $fake->post_title = 'Coming Soon'; $fake->post_name = 'coming-soon'; $fake->is_fake = TRUE; $fake->ID = 0; $fake_posts = array_fill( 0, $to_fill, $fake ); $query->posts = array_merge( $query->posts, $fake_posts ); } ); 

Изменить: избегать редактирования шаблонов

Теперь мы должны помешать поддельным сообщениям иметь постоянную ссылку

 add_filter( 'the_permalink', function( $permalink ) { if ( isset($GLOBALS['post']->is_fake) ) { return '#'; } return $permalink; } ); 

И использовать в ближайшее время изображение как миниатюру сообщения:

 add_filter( 'get_post_metadata', function( $check, $pid, $key ) { global $post; if ( $key === '_thumbnail_id' && empty($pid) && isset( $post->is_fake ) ) { $check = 1; // just a non falsey number to pass has_thumbnail check } return $check; }, PHP_INT_MAX, 3 ); add_filter( 'post_thumbnail_html', function( $html, $pid ) { global $post; if ( empty($pid) && isset( $post->is_fake ) ) { $html = '<img src="http://example.com/path/to/coming-soon.png" alt="coming Soon" />'; } return $html; }, PHP_INT_MAX, 2 ); 

Вот одна идея, как можно играть с фильтром the_posts таким образом, что вам не нужно изменять текущий код шаблона:

 /** * Append "Coming Soon" posts, if there are not enough posts * * @see http://wordpress.stackexchange.com/a/161275/26350 */ add_filter( 'the_posts', function( $posts, $q ) { if( ! is_admin() && $q->is_main_query() ) { $count = count( $posts ); $ppp = $q->query_vars['posts_per_page']; // Assume there's at least one post available, before filling up: if( $count > 0 && $count <= $ppp ) { // Cet "Coming Soon" post $tmp = get_post( 123 ); // Adjust this ID to your needs // Fill up with the "Coming Soon" post: for( $i = $count + 1 ; $i <= $ppp; $i++ ) { $posts[] = $tmp; } } } return $posts; } ,99, 2 ); 

Это предполагает, что у вас есть Скоро! post / page, вам просто нужно изменить идентификатор сообщения.

Обратите внимание, что это для PHP версии 5.3+.

Обновление: спасибо @GM за подсказку о пропуске крюка pre_get_posts .

Надеюсь, вы можете изменить это на свои нужды.

Проведя 50 минут, безуспешно объясняя принятый ответ коллеге …

Хочу отметить, что для простого случая базовая проверка почтового счета может быть вполне достаточной для шаблона такого вывода:

 if ( 6 > $wp_query->post_count ) { // placeholder output }