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で指定した記事の数が入っています。

$stickyという変数には、ブログのトップに固定した記事の数が入っています。

そして、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日現在)、お勧めです。