Local環境でカスタム投稿のページネーションが404に!原因はWP_Queryの使い方だった

WordPressでカスタム投稿を作って、ページネーション(/page/2/ など)を使おうとしたところ、
Local by Flywheel(マルチサイト+サブディレクトリ型)環境で 404 が出てしまう現象にぶつかりました。
今回はそのときに試したことや学んだことを、忘れないようにメモしておきます。

発生した問題

  • カスタム投稿のアーカイブページで、/page/2/ が 404 に
  • Local(マルチサイト / サブディレクトリ型)でのみ発生
  • 本番(マルチサイト / サブドメイン型)では正常動作

試したこと

  1. rewrite の 'with_front' => true/false 両方試す
  2. .htaccess を見直し、パーマリンク設定を再保存
  3. flush_rewrite_rules() を手動実行(functions.php)
  4. get_pagenum_link()paginate_links() のURL生成の見直し
  5. Localの仮想URL構造を再確認
  6. WP_Query$paged の取得・使用方法を見直し

flush_rewrite_rules()では、パーマリンクのルールをリセットして再生成ができます。
functions.php やプラグインで「初回有効化時だけ」使います。

結論(解決法)

最終的には、pre_get_posts を使ってメインクエリの調整を行うことで解決しました。
また、 WP_Query を使わずに、メインループhave_posts()を使うように書き換えました。

「メインループ」とは?

自動的に最初から用意されてる投稿のループ」がメインループ

if (have_posts()) :
  while (have_posts()) : the_post();
    // 投稿の表示
  endwhile;
endif;

このループは、WordPressがURL(アーカイブ、検索、投稿詳細など)に応じて最適な内容を勝手に用意してくれてる

「WP_Queryで作る独自ループ」とは?

$my_query = new WP_Query([
  'post_type' => 'study',
  'posts_per_page' => 5,
  'paged' => $paged
]);

これが独自ループ(カスタムクエリ)と呼ばれるもの

以下のような落とし穴もある

特徴メリットデメリット
WP_Query(独自ループ) 好きな条件で投稿取得できる ページネーションやタイトル、条件を自分で整備しないと壊れやすい
メインループ WordPressが全自動で整えてくれる 条件変更には pre_get_posts が必要(でも安定)

今回学んだこと

  • Local環境では .htaccessrewrite_rules が意図通り動かないことがある
  • 特に「マルチサイト+サブディレクトリ構成」だとURLまわりの挙動が不安定

WP_Queryのmax_num_pages

max_num_pages = 全部で何ページあるという情報

paginate_links() は「全体のページ数」を元にしてページ送りを作る。
WP_Query を使ったとき、正しく max_num_pages を指定しないと、「ページが1個しかない」と誤認されることがある
そうなると ページ送りが正しく出ない・動かない 現象が起きる

独自ループを使うならtotal に max_num_pages を明示して渡してあげる

$custom_query = new WP_Query($args);
$total_pages = $custom_query->max_num_pages;

echo paginate_links(array(
  'total' => $total_pages
));

pre_get_posts のほうが安定することがある

メインクエリを調整すると

  • 余計な WP_Query を書かなくて済む
  • ページネーションが最初から正しく動く
  • テーマのテンプレートに影響しにくい

今後の対策メモ

  • 本番とLocalでURL構成が異なるときは、Localだけで完結させようとしない
  • 必要に応じて、ステージング環境(同一ドメイン構成)を導入する
  • テスト段階では、なるべくWPのメインループに乗せた構成を意識する

ひとこと感想

ビバナナ

「原因はマルチサイトかも…」と思ってたけど、原因は一つではなく、WP_Query の使い方が影響してたという落とし穴…。
でも一つずつ検証して、しっかりメモに残せたことで次に活かせそうです。

コメントを残す

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください