本文へ移動

トラブルシュート

WP_Queryでカスタム投稿が出ない原因
|post_type・公開状態を確認

「管理画面にはイベントがあるのに、一覧には1件も出ない」場合は、登録時の投稿タイプ名とWP_Queryのpost_typeが同じか一字ずつ確認します。次に公開済み投稿があるかを確認し、tax_queryやmeta_queryを外した最小クエリで原因を切り分けます。

Huddly Huddly 投稿日: 2026年9月11日 読了目安: 4分

最初にpost_typeのスラッグと公開済み件数を見る

カスタム投稿が出ないときは、register_post_type()の第1引数と$argspost_typeが同じか確認します。eventなどの第1引数が投稿タイプのスラッグです。管理画面の表示名ではなく、登録スラッグと公開済み投稿数を見ます。

次にpost_typepost_status => ‘publish’、表示件数だけで試します。取得できたらtax_querymeta_queryを1つずつ戻し、0件のままならget_post_type_object()で登録状態を確認します。

0件・404・表示ずれを分ける

独自のWP_Queryが0件なのか、アーカイブURLや個別URLが404なのか、ループ後の表示だけがおかしいのかで、疑う場所は変わります。まず症状を分けます。

症状最初に疑う原因最初に見る場所
独自のWP_Queryだけ0件になるpost_typeの指定漏れ・スラッグ違いWP_Queryの$args
管理画面にはあるが公開一覧に出ないpost_statusがpublishではない投稿の公開状態
条件を足したら出なくなったtax_queryやmeta_queryが厳しすぎる絞り込み条件を一度外す
カスタム投稿アーカイブURLが404になるhas_archiveやrewrite、publicly_queryableの設定register_post_typeの登録設定
カスタム投稿の個別URLが404になるpublicly_queryableやrewrite、リライトルール登録設定とパーマリンク設定
ループ後のタイトルだけ別投稿になる投稿データを戻していないwp_reset_postdata()

post_typeを書いていても、表示名を指定していたり、スラッグのハイフンとアンダースコアを取り違えたりすると取得できません。

event-itemevent_itemは別の投稿タイプ名です。管理画面の表示名ではなく、register_post_type()の第1引数と一字ずつ一致しているか確認してください。

よくある原因一覧

取得対象の指定に迷う場合は、先にpost_typeの指定方法を確認してください。カスタム投稿に限らず結果が0件になる場合は、条件を外す順番をまとめた投稿が表示されない時のチェックリストから切り分ける方が早いです。

複雑な条件を読む前に、投稿タイプ、公開状態、絞り込み条件、登録設定の順に確認します。

確認する順番

  1. 1
    post_typeに正しい投稿タイプスラッグを書いているか確認する
  2. 2
    post_statusをpublishにして最小構成で試す
  3. 3
    tax_query、meta_query、date_queryを一度外す
  4. 4
    投稿が本当に公開済みか確認する
  5. 5
    カスタム投稿タイプの登録設定を確認する
  6. 6
    pre_get_postsなどでクエリを書き換えていないか確認する

最小構成でカスタム投稿が取れるか確認する

post_typepost_statusposts_per_pageだけにして、公開済みのevent投稿が取れるか確認します。eventは実際の投稿タイプスラッグへ置き換えてください。カテゴリー、カスタムタクソノミー、カスタムフィールド、日付、並び順はいったん外します。

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

PHPtemplate-parts/event-check.phpカスタム投稿タイプ event が取得できるか確認する最小例
$args = [   'post_type'      => 'event',   'post_status'    => 'publish',   'posts_per_page' => 3,]; $event_query = new WP_Query( $args ); if ( $event_query->have_posts() ) {   while ( $event_query->have_posts() ) {      $event_query->the_post();       echo esc_html( get_the_ID() . ' : ' . get_the_title() );      echo '<br>';   }} else {   echo esc_html( 'event posts not found.' );} wp_reset_postdata();

ここで表示されるなら、後から足したtax_querymeta_queryorderbypagedなどを1つずつ戻します。0件のままなら、スラッグ、公開状態、投稿タイプの登録状態へ戻ってください。

カスタム投稿が出ない原因を順に確認する

最小構成で結果を確認したら、投稿タイプ名、公開状態、登録設定、外部処理の順に実際の条件へ戻します。

post_typeのスラッグ違いを確認する

管理画面の表示名と投稿タイプのスラッグは別の値です。「イベント」と表示されていても、WP_Queryに書くのはeventeventsのような登録時の投稿タイプ名です。

WordPress公式リファレンスでは、WP_Queryのpost_typeは投稿タイプを指定する引数で、通常の既定値はpostです。ただし、tax_queryを指定したクエリの既定値はanyになります。anyでも、exclude_from_searchtrueの投稿タイプなどは対象外です。カスタム投稿を確実に対象にしたい時は、post_typeを省略せずに指定します。

書き方意味注意点
'post_type' => 'post'通常の投稿を取得するカスタム投稿は対象外
'post_type' => 'page'固定ページを取得する投稿とは別扱い
'post_type' => 'event'eventというカスタム投稿を取得する実際のスラッグに置き換える
'post_type' => array( 'post', 'event' )通常投稿とeventをまとめて取得する複数指定は配列で書く
'post_type' => 'any'複数の投稿タイプを広く対象にするすべての投稿タイプが必ず含まれるわけではない

スラッグが分からない場合は、登録コードやCPT系プラグインの設定画面を確認します。テーマやプラグイン内でregister_post_type( ‘event’, … )のように登録されているなら、WP_Queryに指定するのはeventです。

一時的にコードで確認したい場合は、get_post_type_object() を使う方法もあります。これは指定した投稿タイプ名の登録情報を取得する関数で、存在しない投稿タイプ名なら null が返ります。

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

PHPdebug-post-type.phpカスタム投稿タイプの登録有無を確認する一時的なコード
$post_type_object = get_post_type_object( 'event' ); if ( $post_type_object ) {   echo esc_html( 'event is registered.' );} else {   echo esc_html( 'event is not registered.' );}

event is not registered.と出たら、WP_Queryではなく、投稿タイプ名、登録処理の読み込み順、CPTを登録するプラグインの有効化状態を確認します。

公開状態と絞り込み条件を確認する

post_type が正しくても、対象の投稿が下書き、予約投稿、非公開などになっていると、通常の公開ページでは期待通りに出ないことがあります。WP_Queryの post_status は、特に指定しない場合は基本的に公開済み投稿を対象にするものとして考えると分かりやすいです。

確認中だけであれば、post_status を明示して動きを見ます。ただし、本番表示で下書きや非公開まで出すのは意図しない公開につながる可能性があるため、目的がはっきりしている時だけにしてください。

確認項目原因になりやすい状態対処
公開状態下書き、予約投稿、非公開になっているまずpublishで確認する
投稿件数対象のカスタム投稿がまだ0件テスト投稿を1件公開する
tax_queryタームのスラッグやtaxonomy名が違う条件を外してから戻す
meta_queryメタキーや値の形式が違う条件を外してから値を確認する
date_query日付条件の範囲外になっている日付条件なしで確認する

条件を足した直後に0件になったなら、その条件を調べます。たとえばtax_queryなら、タクソノミー名、タームスラッグ、relationoperatorが意図どおりか確認します。

アーカイブURLが出ない場合は登録設定を見る

テンプレート内の new WP_Query() ではなく、カスタム投稿アーカイブのURLが表示されない、404になる、タクソノミーアーカイブで投稿が出ない、という場合は、WP_Queryの書き方だけではなく、カスタム投稿タイプの登録設定も確認します。

register_post_type()publicは、投稿タイプが管理画面や読者側にどう見えるかに関係する複数の設定へ影響します。公式リファレンスでは、publictrueにすると、個別指定がない場合のexclude_from_searchpublicly_queryableshow_in_nav_menusshow_uiも公開側の初期値になります。publicfalseなら、これらは非公開側の初期値になります。

見ている画面関係しやすい設定補足
テンプレート内の独自WP_Querypost_type、post_status、絞り込み条件まず最小構成で確認する
カスタム投稿アーカイブURLhas_archive、rewrite、publicly_queryableURL側の表示設定を確認する
検索結果に出ないexclude_from_search検索対象から除外していないか確認する
タクソノミーアーカイブで出ないexclude_from_searchやタクソノミーとの紐づけ投稿タイプとタクソノミーの登録を確認する

たとえば「/event/ の一覧が404になる」という相談と、「固定ページテンプレートに書いたWP_Queryで event が0件になる」という相談は、似ていても別の問題です。前者はアーカイブやリライトルールの設定、後者はWP_Queryの条件を先に疑います。

pre_get_postsやループの後処理も確認する

サイト全体で pre_get_posts を使っている場合、意図せず別のクエリにも条件が効いていることがあります。たとえば、メインクエリ用に書いたつもりの条件が、管理画面や別の一覧にも影響してしまうと、カスタム投稿が出ないように見えることがあります。

メインクエリだけを変えるなら、管理画面を除外し、is_main_query()などで対象を限定します。また、独自のWP_Queryでthe_post()を使った後はwp_reset_postdata()で投稿データを戻します。これを忘れると、後続のテンプレートタグが別の投稿を参照します。

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

post_typepost_statusはWP_Query、公開範囲はregister_post_type()、登録の有無はget_post_type_object()、メインクエリの変更はpre_get_postsの公式資料で確認します。

公式リンク

公式ドキュメント

最後に確認したいこと

最小構成で表示されるなら追加条件、0件ならスラッグ、公開状態、登録状態を調べます。アーカイブや個別URLの404は独自クエリと分けて、登録設定とリライトルールを確認してください。

カスタム投稿の最終判断

  • 投稿タイプが登録済みで公開対象になっている
  • 独自クエリとアーカイブURLの問題を分けた
  • 分類・メタ条件を戻した後の対象件数を比較した
  • pre_get_postsの対象範囲を限定した
  • サブループ後に本来の記事情報へ戻ることを確認した
WP Query BuilderBuilderで条件を組み直す条件を選び、WP_Queryのコードを画面で作れます。Builderでクエリを作る

この記事を書いた人

Huddly

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

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

この記事の検証情報

検証環境

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

更新履歴

  • 2026年9月11日 初回公開

この記事を活用する

あとで見返す・共有する

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

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