WordPressでカスタム投稿やタクソノミーの一覧ページを作っていて、
**ページネーションで途中までうまく行っているのに4ページ目,5ページ目などそれ以降にアクセスしたら404になる**ということが起こったことはありませんか??
その原因、実は WP_Query
の使い方にあるかもしれません。
この記事では、WordPressにおける「メインクエリ」と「カスタムクエリ(WP_Query)」の違いと、
それぞれの正しい使い分けについてわかったことをまとめます!
今回起こった事象:「ページ4目以降に行ったら404になる」
1,2,3ページ目までは指定のポストタイプ記事が表示されているのに4ページ目になったら404になってしまうという現象が発生しました。
タクソノミーごとに表示していたので、別のグループも見てみると4ページ目になっても上手くいっているものと7ページ目になると404になってしまうなど必ずしも特定のページで発生するという感じではなさそうでした。
この事象が起こった時に作成していたコードを一部変更して以下に記載します。
カスタム投稿 type-projects
とタクソノミー type-projects_tag
を使って、
一覧ページを作成しようとしています。
$args = array(
'post_type' => 'type-projects',
'posts_per_page' => 4,
'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
'tax_query' => array(
array(
'taxonomy' => 'type-projects_tag',
'field' => 'slug',
'terms' => 'news',
),
),
);
$query = new WP_Query($args);
これだけみると普通に動きそうです。
実際に3ページ目までは正常に動いていたし、、、、
でも /type-projects_tag/news/page/4/
にアクセスすると……404 Not!Found
なぜ404になるのか?
WordPressは、URLからそのページが「どの種類のページか(アーカイブ?投稿?検索?)」を判断し、
自動で $wp_query
にクエリを組み立ててくれています。
つまり、/type-projects_tag/news/page/4/
というURLにアクセスした時点で、
WordPressは内部的に:
$wp_query = new WP_Query(array(
'post_type' => 'type-projects',
'taxonomy' => 'type-projects_tag',
'term' => 'news',
'paged' => 4,
));
をもうやってくれてるんです。
そこへさらに new WP_Query()
で自前のクエリを実行すると、
WordPressは "URLに対応する中身がない" と判断して404にしてしまう というわけです。
アーカイブページではメインクエリを使うべき!
タクソノミー一覧、投稿タイプのアーカイブ、検索結果ページなどでは、
WordPressが用意したメインクエリ(have_posts()
, $wp_query
)を使うのが正しいようです。
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<!-- 投稿表示 -->
<?php endwhile; ?>
<?php endif; ?>
投稿数や条件をカスタマイズしたい場合は?
そんなときは functions.php
に pre_get_posts
を追記すればOK
add_action('pre_get_posts', function($query) {
if (!is_admin() && $query->is_main_query() && is_tax('type-projects_tag')) {
$query->set('posts_per_page', 4);
$query->set('post_status', 'publish');
}
});
じゃあ WP_Query は使っちゃダメなの?
WP_Queryには他の場所で活躍できる!!
WP_Query は「今のURLと関係ない別の投稿グループを出したい」ときに使います。
たとえば:
- トップページに "おすすめ投稿" を表示
- サイドバーに "最近のお知らせ"
- 固定ページに特定カテゴリだけの投稿一覧を表示
これらはすべて WP_Query
が使える場合です。
まとめ:どっち使う?
目的 | 使うべきクエリ |
---|---|
今のURLに応じた投稿を表示(カテゴリ、タクソノミー、アーカイブなど) | メインクエリ(have_posts) |
今のURLと関係ない投稿を表示(ピックアップ、サイドバーなど) | WP_Query |
最後に:ハマりがちな404は「URLとクエリの整合性」が原因
WordPressは便利だけど、自動でやってくれてることを無視すると途端に崩れる仕組みです。
だからこそ、「どのページではメインクエリを使うべきか」を意識して使い分けることで、
安定したテーマ作り・表示崩れのない実装ができます!
このあたりでハマってる人がいたら、ぜひこの記事が参考になれば嬉しいです💡