WordPressでposts_per_pageの設定が効かない場合の対処法
この記事では、
「WordPressでposts_per_pageの設定が効かない場合の対処法」
を紹介致します。
注意:本記事の内容は正確ではありません。下記の方法を使用した場合、固定記事がゼロだと全ての記事が表示されなくなります。現在は、別の方法で対応しています。
答え:posts_per_pageで指定した記事数から、ブログのトップに固定した記事の数を引く
サイトの表紙、front-page.phpあたりで、新着記事を常に4つ並べて表示したいとします。
そこで、次のようなコードを書いたとします。
<?php
$the_query = new WP_Query( 'posts_per_page=4' );
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
?>
<div>
繰り返したい処理
</div>
<?php endwhile; wp_reset_postdata(); else : ?>
<?php endif; ?>
これはこれで、ちゃんと動きます。
しかし、このままだと、ブログのトップに固定した記事が1つ以上あると、こちらの意図に反して、5つ以上の記事が並んでしまいます。
例えば、ブログのトップに固定した記事が1つある場合、これに加えて4つの記事が並ぶことになり、合計で5つの記事が表示されてしまいます。
記事を常に4つ並べて表示したくてposts_per_page=4と指定したとしても、ブログのトップに固定した記事は、この4とは全く関係なく、個別に独立して表示されてしまうようです。
固定されているくせに、なんて自由なんでしょう。にっくきアンチェイン野郎です。
ブログのトップに固定した記事が1つの場合、これと3つの新着記事を一緒に表示して、合計で4つの記事を表示するには、どうすればいいのでしょうか。
対処法は、posts_per_pageで指定した記事数4から、ブログのトップに固定した記事の数1を引くことです。
具体的には、以下のようなコード(たった2行)を追記しましょう。
<?php
$the_query = new WP_Query( 'posts_per_page=4' );
//追記スタート
$sticky = get_option('sticky_posts');
if ( empty($sticky) ) $the_query -= count($sticky);
//追記エンド
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
?>
<div>
繰り返したい処理
</div>
<?php endwhile; wp_reset_postdata(); else : ?>
<?php endif; ?>
$the_queryという変数には、posts_per_pageで指定した記事の数4が入っています。
$stickyという変数には、ブログのトップに固定した記事の数1が入っています。
そして、if ( empty($sticky) ) $the_query -= count($sticky);で、4-1=3という引き算が行われ、$the_queryには3が入っていきます。
こうすることで、ブログのトップに固定した記事を1つと、3つの新着記事を一緒に表示して、合計で4つの記事を表示することができます。
ブログのトップに固定した記事の数が1の場合、上記のようにposts_per_pageで指定した記事数4から1を引いて、表示される新着記事の数を3に減らし、ブログのトップに固定した記事と一緒に表示させることで、posts_per_pageで指定した記事数4が常に維持される、という仕組みです。
上記コードでちゃんと意図通りにWordPressが動いたので(2020年6月11日現在)、お勧めです。