WordPressにて、例えば以下のようなループを記述したとします。
<ul> <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( 'paged' => $paged, 'posts_per_page' => 3, 'post_type' => array('post'), ); $wp_query_post = new WP_Query($args); if ($wp_query_post->have_posts()): while($wp_query_post->have_posts()): $wp_query_post->the_post(); ?> <li> <a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a> </li> <?php endwhile; endif; wp_reset_postdata(); ?> </ul>
この場合、新しい投稿が3件表示されます。ですが、先頭固定記事(この投稿を先頭に固定表示)があるとどうなるでしょうか。先頭固定記事がある場合は、先頭固定記事の数の分、表示件数が増えてしまいます。
WP_Queryには「ignore_sticky_posts」というパラメータも用意されていて、ignore_sticky_postsをtrueにすると、先頭固定ページは無視されるようになります。それでよければ表示件数がオーバーしてしまう問題は解決ですが、先頭固定記事は表示しつつ、表示件数も指定した数に合わせたい、というケースも多いと思います。
そんな時のために、先頭固定記事を表示しつつ、posts_per_pageで指定した表示件数をオーバーしないようにする方法をご紹介したいと思います。
WP_Queryで表示件数を指定していても、先頭固定記事があると表示件数がオーバーしてしまう挙動を解消する方法
先頭固定記事があっても、表示件数をオーバーしないようにするためには、ループを以下のように記述します。
<ul> <?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $list_count = 3; $sticky = get_option('sticky_posts'); if ( !empty($sticky) ) $list_count -= count($sticky); $args = array( 'paged' => $paged, 'posts_per_page' => $list_count, 'post_type' => array('post'), ); $wp_query_post = new WP_Query($args); if ($wp_query_post->have_posts()): while($wp_query_post->have_posts()): $wp_query_post->the_post(); ?> <li> <a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a> </li> <?php endwhile; endif; wp_reset_postdata(); ?> </ul>
$list_countに表示したい件数を入れて、先頭固定記事が存在している場合は、その分値を差し引いています。差し引いた数をposts_per_pageで指定する、という方法です。
このように、先頭固定記事の分、表示件数の指定から差し引いてあげることで、指定している表示件数をオーバーすることはなくなります。
ただ、$list_countの値よりも先頭固定記事の数の方が多くなると、posts_per_pageがマイナスの値になってしまうので、そこは注意が必要です。
あとがき
投稿を先頭に固定する機能は標準で実装されていますし便利な機能なので、納品先のクライアントが運用で使用する機会もあると思います。
上述したループの書き方を覚えておくと、使える場面も結構あるのではないでしょうか。ぜひ参考にしていただければ幸いです。