WordPressでカスタム投稿を作って、ページネーション(/page/2/ など)を使おうとしたところ、
Local by Flywheel(マルチサイト+サブディレクトリ型)環境で 404 が出てしまう現象にぶつかりました。
今回はそのときに試したことや学んだことを、忘れないようにメモしておきます。
目次
発生した問題
- カスタム投稿のアーカイブページで、
/page/2/が 404 に - Local(マルチサイト / サブディレクトリ型)でのみ発生
- 本番(マルチサイト / サブドメイン型)では正常動作
試したこと
- rewrite の
'with_front' => true/false両方試す - .htaccess を見直し、パーマリンク設定を再保存
flush_rewrite_rules()を手動実行(functions.php)get_pagenum_link()やpaginate_links()のURL生成の見直し- Localの仮想URL構造を再確認
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環境では
.htaccessやrewrite_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 の使い方が影響してたという落とし穴…。
でも一つずつ検証して、しっかりメモに残せたことで次に活かせそうです。