WP-PageNaviで2ページ目以降が404エラー【解決】

最近すっかりWordPressから離れていたんですが、良くも悪くも情報量が豊富ですね。
WordPressは10年以上前(WordPress MEの頃)からいじってますが、どんどん複雑化してきて最近はhome.phpやらfront-page.phpやらindex.phpやらと、テンプレート構造を理解するのさえ大変です。

時間があったので何年か前に構築したサイトを手直ししていたところ、トップページのページネーションが効かなくなってしまいました。

100個近いカスタムフィールド・300超えのカテゴリ・function長すぎなコンテンツで、どのタイミングで表示されなくなったのか不明なまま、ネット上の情報を頼りにあれこれ試して半日が過ぎ、ようやく解決しました。

固定ページ用WP-PageNavi対策コード

function.php

function pagenavi_home($wp_query) {
  if (!is_admin() && $wp_query->is_main_query() && $wp_query->is_home()) {
    $wp_query->set('cat', 5);
    $wp_query->set('post_type', 'iisys');
    $wp_query->set('posts_per_page', 12);
  }
}
add_action('pre_get_posts', 'pagenavi_home');

  • 3行目のcatはカテゴリーID5を指しています。不要であれば行ごと削除。
  • 4行目のpost_typeはカスタム投稿タイプを指定。iisysは一例で、通常の投稿であればpostになります。
    両方を指定したい場合には配列にします。

    $wp_query->set('post_type', array('post', 'iisys'));
  • 5行目のposts_per_pageは表示件数。記事数よりも多い数にするとページネーションは表示されません。

上記を書いたうえで、該当テンプレート(私の場合はindex.php)のquery_posts等を消してください。

以下は私の環境では効果ありませんでした。

  • 管理画面の表示設定にある「1ページに表示する最大投稿数」を1件にする
  • pagedではなく、$page = get_query_var( ‘page’, 1 ); にする
  • query_postsではなくWP_Queryにして、wp_pagenavi(array(‘query’=>$the_query)); にする
  • いろんな場所でwp_reset_queryしてみる
  • 時間を置いてみる・祈ってみる

get_query_varの関数リファレンスに書いてあるこの部分を修正するのが正しいのかもしれませんね。

get_query_var() は WP_Query で認識されている「パブリック・クエリ変数」のみを取得します。言い換えれば、独自のクエリ変数でカスタム URL を作成したのみで追加処理(以下参照)を伴わない場合 get_query_var() はそういったクエリ変数を取得できません。

投稿者: iisys

全ての記事