4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Wordpress]WP_Queryでページネーションが404になる理由と正しい使い分け

Posted at

WordPressでカスタム投稿やタクソノミーの一覧ページを作っていて、
**ページネーションで途中までうまく行っているのに4ページ目,5ページ目などそれ以降にアクセスしたら404になる:frowning2:**ということが起こったことはありませんか??

その原因、実は WP_Query の使い方にあるかもしれません。
この記事では、WordPressにおける「メインクエリ」と「カスタムクエリ(WP_Query)」の違いと、
それぞれの正しい使い分けについてわかったことをまとめます!


今回起こった事象:「ページ4目以降に行ったら404になる」

1,2,3ページ目までは指定のポストタイプ記事が表示されているのに4ページ目になったら404になってしまうという現象が発生しました。
タクソノミーごとに表示していたので、別のグループも見てみると4ページ目になっても上手くいっているものと7ページ目になると404になってしまうなど必ずしも特定のページで発生するという感じではなさそうでした。

この事象が起こった時に作成していたコードを一部変更して以下に記載します。:point_down_tone2:
カスタム投稿 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:angel_tone2:


なぜ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.phppre_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は便利だけど、自動でやってくれてることを無視すると途端に崩れる仕組みです。
だからこそ、「どのページではメインクエリを使うべきか」を意識して使い分けることで、
安定したテーマ作り・表示崩れのない実装ができます!

このあたりでハマってる人がいたら、ぜひこの記事が参考になれば嬉しいです💡

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?