まず結論
pre_get_posts は、WordPress が投稿を取得する前にクエリ条件を調整できるフックです。既存のアーカイブや検索結果など、main query の表示件数、投稿タイプ、並び順を変えたい時に使うことがあります。
pre_get_posts は、WP_Query の結果が取得される前に処理を差し込むためのフックです。すでに WordPress が用意しているページ本体のクエリを調整したい時に使われます。
初心者が最初に押さえるべきなのは、pre_get_posts は「新しい一覧を追加するためのもの」ではなく、「既存のクエリ条件を実行前に変えるためのもの」だという点です。関連記事やサイドバーの別一覧を作る場合は、独自 WP_Query のほうが自然なことがあります。
pre_get_posts は何をするフックか
pre_get_posts は、クエリが実行される前に呼ばれるフックです。フックに渡される $query オブジェクトに対して、set() を使って条件を変更できます。
たとえば、検索結果の表示件数を10件にしたり、アーカイブで特定の投稿タイプを含めたり、一覧の並び順を変えたりできます。
ここで大事なのは、pre_get_posts は影響範囲が広くなりやすいということです。対象を絞らずに条件を変更すると、管理画面やサイドバーの一覧、別の独自クエリまで変わる原因になります。
そのため、is_admin() と is_main_query() の確認をセットで考えます。ページ本体のクエリだけを変えたいのか、別のクエリも含めたいのかを先に決めます。
混同しやすい考え方
- 既存アーカイブを変えたい時に毎回
new WP_Query()で作り直す - 関連記事のような追加一覧まで
pre_get_postsで作ろうとする - 対象を絞らずに全クエリへ変更をかける
整理した考え方
- ページ本体の一覧条件は
pre_get_postsで main query 調整を検討する - 追加一覧は独自
WP_Queryを検討する is_admin()とis_main_query()で対象を絞る
is_main_query() を確認する理由
pre_get_posts では、is_main_query() の確認が重要です。同じページ内には、main query だけでなく、サイドバーや関連記事などの独自クエリが存在することがあります。
対象を絞らないと、これらの独自クエリにも変更がかかる可能性があります。ページ本体の一覧だけを変えたいなら、main query に限定します。
is_main_query() は、現在扱っているクエリが WordPress の主要なクエリかどうかを確認するためのものです。関数ではなく $query->is_main_query() として使う形を意識します。
pre_get_posts の動作を確認する時は、まず変更対象を小さくします。検索結果だけ、アーカイブだけ、特定の投稿タイプだけ、というように範囲を絞ります。
Builder での扱い
WP Query Builder では、pre_get_posts は通常の独自 WP_Query 生成とは分けて扱う想定です。新しい一覧を追加する場合は custom query のコード、既存一覧を調整する場合は pre_get_posts のコード、という切り分けが必要です。
初心者向けには、「既存の一覧を変える」か「新しい一覧を追加する」かを最初に選ばせると分かりやすくなります。前者では pre_get_posts、後者では WP_Query の生成が候補になります。
生成コードでは、is_admin() と $query->is_main_query() のチェックを省略しないことが重要です。さらに、検索結果だけ、アーカイブだけ、特定の投稿タイプだけ、といった条件分岐も必要に応じて追加します。
使いどころ・避けどころと実践確認
WordPressが実行する前のメインクエリ条件を、対象画面へ限定して変更したい時に使います。
テンプレート内で独自一覧を作るだけの場合や、対象判定なしで全クエリを書き換える使い方は避けます。
管理画面、メインクエリ、アーカイブ種別のガードが不足すると、別画面や内部クエリまで影響します。
変更したいURLを一つ挙げ、変えてはいけないURLも一つ挙げると、条件分岐の漏れを見つけやすくなります。
対象・非対象URLでフック前後のクエリ変数と表示された投稿IDを記録し、変更範囲が意図した画面だけか確認します。
WordPressの仕様で確認するポイント
公式資料では、pre_get_posts フックのリファレンスで、クエリ実行前に条件を変更する方法を確認できます。WP_Query のリファレンスでは、変更できる引数の種類を確認できます。
また、is_main_query() の公式リファレンスを確認すると、main query だけを対象にする考え方を理解しやすくなります。
公式リンク
公式ドキュメント
pre_get_posts は、WordPress が投稿を取得する前にクエリ条件を調整するためのフックです。既存のアーカイブや検索結果など、main query の条件を変えたい時に使うことがあります。
迷った時は、既存一覧を変えたいのか、追加一覧を作りたいのかを先に分けます。既存一覧なら pre_get_posts、追加一覧なら独自 WP_Query を検討します。
pre_get_posts の最終チェック
pre_get_postsはクエリ実行前に条件を変更するフックだと理解している- 既存一覧を変えたいのか追加一覧を作りたいのかを分けた
is_admin()と$query->is_main_query()で対象を絞った$query->set()で変更する引数を確認した- 検索結果やアーカイブなど対象ページを絞った
- pagination や offset への影響を確認した
公式リファレンス
仕様や原文の説明も確認したいときは、公式ドキュメントと整理ページをあわせて見ると理解しやすくなります。
この記事の検証情報
検証環境
- WordPress
- 7.1
- PHP
- 8.3.33
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年8月29日 本文と補助情報を更新
- 2026年8月15日 初回公開
この用語を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。
他の用語も続けて確認できます
似た用語や周辺知識をまとめて見たいときは、用語集トップから探すと迷いにくくなります。