WordPressのページャーってよく思ったとおりにならないことがあるけれど、今回は途中まではちゃんとページャーが動作しているのに、途中から「ページがありません」というページに飛んでしまうという状況になって困った。

<経緯>

category-today.phpという新規テンプレート内で、カテゴリーの一覧を表示。
1ページの表示件数はquery_postsを使って変更。
投稿数が多いためにページャーを設置した。

<現象>

[1][2][3][4][5]・・・[20]

1から10ページまでは正常に見えるのだけれど、11ページからリンク先が「ページがありません」になる。

<考察>

どうやら、WordPress(以下WP)の「設定」の投稿の表示件数と関係しているようです。

——

投稿数 : 100件
WPの表示件数設定 : 10件
category-today.phpでの表示件数設定 : 5件
——
ページャーは1ページ5件で計算して [1][2][3][4][5]・・・[20] と20ページまであることになっている。
だけれどWPは1ページ10件表示で計算して、11ページ以降は存在しないと認識。そのため11ページ以降がnot foundに。

<問題と解決法>

cateogryテンプレートに query_posts()関数を使ったのが、それが間違いでした。
メインループでquery_postsを使用して表示件数を上書きしたせいで、こういう現象になったわけです。
カテゴリーテンプレートはメインループで表示されるので、その表示件数はWPの「設定」で行った投稿の表示件数を引き継いでいる。
メインループの表示件数を個別に変更したい場合は、 functions.php にメインループを上書きする指示を書く、のが正しい。query_postsを使ってはいけませんでした。

functions.phpでアクションフック pre_get_postsを使ってメインループの条件を上書きします。
カテゴリーを限定して表示件数を変更しています。
参考:Codex: pre_get_post ,  Codex: is_category

function your_function_name( $query ) {

  if ( is_category( 'カテゴリー名' ) ) {
    $query->set( 'posts_per_page', 表示件数 );
  }
  return $query;
}
add_filter( 'pre_get_posts', 'your_function_name' );

query_postsは現在非推奨です。

Site Search

Profile

profile

Web制作を生業にしています。主にHTML, CSS, JavaScript, PHP, WordPressのカスタマイズなどしてます。忘れっぽいので備忘録としてWebの小ネタを書いたり、人生のいろんなことを不定期にのんびり更新しています。小学生男児の母(シングルマザー)です。