本文へ移動

トラブルシュート

WP_Queryで投稿が表示されない原因と確認チェックリスト

WP_Queryで投稿が表示されないときは、テンプレート未実行、取得0件、ループの出力、後続表示の参照ずれを分けて確認します。最小構成から条件を1つずつ戻し、原因を特定する順番を整理します。

Huddly Huddly 投稿日: 2026年8月20日 読了目安: 6分

投稿が出ないときの最短確認

最初に、固定文が表示されるか、PHPエラーがないか、have_posts() が true かを確認します。次に、問題が起きているのと同じ場所で最小構成を試し、投稿が返れば追加条件を1つずつ戻します。投稿は返っているのに見えない場合は、ループと出力側を確認します。

まず症状を整理する

WP_Queryで「投稿が表示されない」といっても、実際には4つの状態があります。テンプレートが実行されていない、クエリが0件、投稿は取得できているが出力されていない、独自ループ後の別コンテンツが違う投稿を参照している、のどれかです。

たとえば have_posts() が false になっているなら、WP_Queryが条件に合う投稿を見つけられていない状態です。一方で、have_posts() は true なのにタイトルが出ないなら、ループ内の出力やテンプレートタグの使い方を確認する必要があります。

症状最初に疑う場所確認すること
固定文も表示されないテンプレート・PHPエラー対象テンプレートが読まれているか、エラーログに停止原因がないか見る
elseの文言が出るWP_Queryの取得条件投稿タイプ、状態、ページ位置、絞り込み条件を見る
have_posts()はtrueだがタイトルが出ないループ・出力同じクエリ変数、the_post()、echo、HTMLやCSSを見る
独自ループ後のタイトルが変になる投稿データの後処理wp_reset_postdata()でメインクエリの投稿へ戻しているか見る
固定文も出ないなら実行場所とPHPエラー、have_posts()falseなら取得条件、trueなのに見えないならループと出力を確認します。ここを分けると、触るべき場所を絞れます。

最初に症状を分ける理由は、原因候補を絞るためです。複数の引数を同時に書き換えると、どの変更で直ったのか分かりません。まず「処理が実行されたか」「クエリが0件か」「出力側の問題か」を分けます。

よくある原因一覧

よくある原因は、投稿タイプや公開状態の見落とし、存在しないページ番号、除外しすぎ、分類・メタ・日付・検索条件の不一致です。次の順番で、単純な原因から確認します。

確認する順番

  1. 1
    同じ実行場所で固定文とPHPエラーを確認する
  2. 2
    最小構成で公開済み投稿が1件返るか確認する
  3. 3
    投稿タイプ・状態・権限・件数・ページ位置・ID条件を確認する
  4. 4
    tax_query・meta_query・date_query・検索語を一度外す
  5. 5
    投稿がある場合はループと出力を確認する
  6. 6
    pre_get_postsなどのフック・テーマ・プラグインの影響を確認する

最初に最小構成で確認する

原因を探すときは、まず条件を削ったWP_Queryを作ります。カテゴリー、タグ、カスタムフィールド、日付条件、検索語、並び順などは一度外し、公開済みの通常投稿を1件取得できるかを確認します。

元のコードと同じテンプレート、同じフック、できるだけ同じ表示位置で置き換えてください。別ページで動いただけでは、元の実行場所に問題がないとは判断できません。本番環境で試す場合は作業後に必ず削除し、可能なら検証環境で確認します。

次のコードは、通常の投稿を1件だけ取得して、IDとタイトルを表示する最小例です。複雑な条件を疑う前に、このコードで投稿が返るかを確認します。

原因を切り分けるための一時的な確認コードです。ローカルなどの検証環境だけで使い、確認後は削除してください。

PHPtemplate-check.php切り分け用:同じ実行場所で公開済み通常投稿が返るか確認
$args = [   'post_type'      => 'post',   'post_status'    => 'publish',   'posts_per_page' => 1,]; $check_query = new WP_Query( $args ); if ( $check_query->have_posts() ) {   while ( $check_query->have_posts() ) {      $check_query->the_post();       echo '<p>WP_Query確認結果: ';      echo esc_html( get_the_ID() );      echo ' / ';      echo esc_html( get_the_title() );      echo '</p>';   }} else {   echo '投稿が見つかりませんでした。';} wp_reset_postdata();

このコードは、通常投稿、公開済み、1件だけに条件を絞っています。post_statuspublishへ固定したのは、ログイン状態や管理画面かどうかで取得対象が変わる余地を減らすためです。問題が起きているのと同じ場所で1件表示されたなら、その場所では基本的なWP_Queryとループが動いています。

反対に、この最小例でも表示されない場合は、公開済みの通常投稿が存在するかを先に確認します。そのうえで、テンプレート未実行、PHPエラー、投稿状態、または別処理の影響を疑います。

最小例が動くなら、WP_Queryの基本構文ではなく、外した条件のどれかが原因です。元の条件を1つずつ戻し、結果が変わった箇所を特定します。

原因別に条件と出力を切り分ける

症状が絞れている場合は、カスタム投稿、カテゴリー、meta_query、ページネーションのどこに問題があるかを分けて確認します。

単純な条件で投稿が返ることを確認できたら、実際のコードへ条件を戻します。ここからは、取得対象、絞り込み、ループ、外部処理の順に見ていきます。

post_typeとpost_statusを確認する

最小構成で表示されないときにまず見るのは、post_typepost_status です。WordPressの投稿はすべて同じように見えても、通常投稿、固定ページ、カスタム投稿、添付ファイルなどで投稿タイプが分かれています。

たとえば説明用のカスタム投稿タイプ event を表示したいのに、post_typepost のままだと、イベント投稿は取得されません。実装時は event を、実際に登録されている投稿タイプスラッグへ置き換えます。

postpageany、カスタム投稿タイプの違いを整理する必要がある場合は、post_typeの指定方法で取得対象から確認してください。

確認項目よくある間違い対処法
post_typeカスタム投稿なのに post のままになっている実際の投稿タイプ名に変更する
pageを取得したいpost_typeを指定していないpost_type に page を指定する
下書きを確認したいpost_status を省略している検証目的なら post_status を明示する
添付ファイルを取得したいattachment だけ指定している必要に応じて post_status に inherit などを指定する

公式リファレンスでは、WP_Queryのpost_statuspublishが基本ですが、ログイン状態や実行場所によって非公開・保護状態が加わる場合があります。公開画面と同じ条件を確かめたい時はpublishを明示します。添付ファイルは通常投稿と扱いが違うため、attachmentを取得する場合はinheritなどの状態も確認してください。

カスタム投稿が出ない時は、管理画面の表示名ではなく、登録時の投稿タイプスラッグを確認します。

件数・ページ位置・ID条件を確認する

取得対象が正しくても、ページ位置やID条件で対象を飛ばしすぎると0件になります。変数を渡している場合は、実際の値と型も確認してください。

確認項目起きやすい問題いったん試すこと
posts_per_page想定と違う値や-1が入る、別処理で上書きされる3など意図した整数を直接指定する
paged / page存在しないページ番号、固定フロントページで変数を取り違える1を指定して結果を比べる
offset取得開始位置を飛ばしすぎる、ページネーションと競合する一度外す
post__in / post__not_inIDが違う、対象をすべて除外する、配列形式が違う条件を外し、実際の整数ID配列を確認する

posts_per_page に0を指定しても、0件になるとは限りません。現在のWordPressでは空の値として扱われ、サイトの表示件数設定へ補正される場合があります。また、-1 は全件取得です。0件の原因と決めつけず、実行時の値と上書き処理を確認します。

post__in へ空配列を渡しても「0件」にはならず、すべての投稿が返る場合があります。対象IDがないときはWP_Query自体を実行しないなど、クエリの前に分岐してください。

tax_queryやmeta_queryを一度外す

最小構成では表示されるのに、条件を足すと表示されない場合は、追加した絞り込み条件を疑います。特に tax_querymeta_query は、少し条件がズレるだけで0件になりやすい部分です。

tax_query はいったん全体を外します。それで投稿が返るなら、まず1つの条件だけを戻し、taxonomyfieldtermsoperatorを確認します。管理画面の表示名と実際のタクソノミー名が違う場合があるため、複数条件のrelationは最後に戻してください。

meta_query も一度外し、1つの条件だけを戻します。メタキー、実際の保存値、comparetypeを確認し、複数条件のrelationは最後に戻します。数値を文字列として比較したり、ACFの表示名と保存用フィールド名を取り違えたりすると、想定どおりに絞り込めません。

配列の形から確認したいときは、tax_queryの基本meta_queryの基本を別々に確認します。まず1条件だけで期待する投稿が返る状態を作ってください。

さらに、date_query、検索語s、投稿者・親子関係などの追加条件も一度外します。最小構成へ1条件ずつ戻せば、どの指定を足したときに0件になるかを特定できます。

ループと出力側も確認する

クエリ条件に問題がないのに画面に出ない場合は、ループと出力側を確認します。WP_Queryでは have_posts() で投稿があるかを確認し、the_post() で1件ずつ投稿データをセットしてから、get_the_title() などのテンプレートタグを使います。

よくあるのは、WP_Query のインスタンスではなく、グローバル側の have_posts() を見てしまうケースです。サブループでは、作成した変数に対して have_posts()the_post() を呼び出す必要があります。

見直し前

うまくいかない例

  • サブループなのに have_posts() だけを呼ぶ
  • the_post() を呼んでいない
  • get_the_title() の戻り値を出力していない
  • 出力処理が while の外にある
改善後

確認しやすい例

  • $check_query->have_posts() のように対象を明示する
  • $check_query->the_post() で同じクエリを進める
  • echo esc_html( get_the_title() ) で出力する
  • 出力処理を while の中に置く

have_posts() がtrueなのに見えない場合、WP_Queryは投稿を取得できています。returnや条件分岐で処理を抜けていないか、HTMLやCSSで非表示になっていないかも確認してください。

wp_reset_postdata() の不足は、直前のWP_Queryが0件になる原因ではありません。独自ループ後のタイトルや本文が別投稿を参照する場合に、末尾でメインクエリの投稿データへ戻しているかを確認します。

別の処理でクエリが変わっていないか確認する

コード上は正しく見えるのに表示されない場合、pre_get_posts などのフック、プラグイン、テーマ内の共通処理でクエリ条件が変更されていることがあります。対象を絞らずに登録された処理は、独自WP_Queryにも影響する可能性があります。

pre_get_posts などの処理を検索し、渡された $queryis_main_query() などで対象が絞られているか確認します。独自WP_Queryだけかサイト全体にも起きるかを分け、検証環境で疑わしい処理を1つずつ外して結果を比較してください。

ここまで確認しても原因が分からない場合は、最小構成から post_typepost_status、ページ位置・ID、tax_querymeta_query、日付・検索条件の順に1つずつ戻します。複数条件を同時に戻さないことが、原因を特定する近道です。

公式資料で確認したいポイント

WP_Queryは指定できる引数が多いため、表示されない原因もひとつではありません。迷ったときは、該当する引数だけを公式リファレンスで確認します。

今回のようなトラブルでは、標準ループと post_typepost_statustax_querymeta_query を分けて確認します。後続表示は wp_reset_postdata()、外部影響は pre_get_posts の資料が手掛かりになります。

公式リンク

公式ドキュメント

最後は小さい条件から戻していく

WP_Queryで投稿が表示されないときは、まず実行場所とPHPエラーを確認し、同じ場所で最小構成を試します。投稿が返らなければ取得条件、返っているならループと出力、後続表示だけがおかしければ投稿データのリセットを確認します。

表示されない問題の最終判断

  • 問題のコードと同じ実行場所で最小構成を試した
  • テンプレート未実行・取得0件・出力・後続表示を分けた
  • 投稿タイプ・状態・ページ位置・ID・絞り込み条件を実データと照合した
  • 条件と外部処理を1つずつ戻し、結果を比較した
  • 修正後に本来の投稿情報とページネーションへ戻ることを確認した
WP Query BuilderBuilderで条件を組み直す条件を選び、WP_Queryのコードを画面で作れます。Builderでクエリを作る

この記事を書いた人

Huddly

Web制作 / フロントエンドエンジニア

WordPressとフロントエンド実装で迷いやすい点を、公式情報と検証結果を分けながら、初学者にも追いやすい順序で整理しています。

この記事の検証情報

検証環境

WordPress
7.1
PHP
8.3.33
テーマ
wpq-media + DDEV
対象
カスタム投稿 / taxonomy / meta_query

更新履歴

  • 2026年8月20日 初回公開

この記事を活用する

あとで見返す・共有する

お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。

任意のご支援 役に立ったときだけ、活動を応援できます OFUSEはサイト・記事制作に使います。支援の有無で、読める内容や使える機能は変わりません。