最初にpost_typeのスラッグと公開済み件数を見る
カスタム投稿が出ないときは、register_post_type()の第1引数と$argsのpost_typeが同じか確認します。eventなどの第1引数が投稿タイプのスラッグです。管理画面の表示名ではなく、登録スラッグと公開済み投稿数を見ます。
次にpost_type、post_status => ‘publish’、表示件数だけで試します。取得できたらtax_queryやmeta_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-itemとevent_itemは別の投稿タイプ名です。管理画面の表示名ではなく、register_post_type()の第1引数と一字ずつ一致しているか確認してください。よくある原因一覧
取得対象の指定に迷う場合は、先にpost_typeの指定方法を確認してください。カスタム投稿に限らず結果が0件になる場合は、条件を外す順番をまとめた投稿が表示されない時のチェックリストから切り分ける方が早いです。
複雑な条件を読む前に、投稿タイプ、公開状態、絞り込み条件、登録設定の順に確認します。
確認する順番
- 1post_typeに正しい投稿タイプスラッグを書いているか確認する
- 2post_statusをpublishにして最小構成で試す
- 3tax_query、meta_query、date_queryを一度外す
- 4投稿が本当に公開済みか確認する
- 5カスタム投稿タイプの登録設定を確認する
- 6pre_get_postsなどでクエリを書き換えていないか確認する
最小構成でカスタム投稿が取れるか確認する
post_type、post_status、posts_per_pageだけにして、公開済みのevent投稿が取れるか確認します。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_query、meta_query、orderby、pagedなどを1つずつ戻します。0件のままなら、スラッグ、公開状態、投稿タイプの登録状態へ戻ってください。
カスタム投稿が出ない原因を順に確認する
最小構成で結果を確認したら、投稿タイプ名、公開状態、登録設定、外部処理の順に実際の条件へ戻します。
post_typeのスラッグ違いを確認する
管理画面の表示名と投稿タイプのスラッグは別の値です。「イベント」と表示されていても、WP_Queryに書くのはeventやeventsのような登録時の投稿タイプ名です。WordPress公式リファレンスでは、WP_Queryのpost_typeは投稿タイプを指定する引数で、通常の既定値はpostです。ただし、tax_queryを指定したクエリの既定値はanyになります。anyでも、exclude_from_searchがtrueの投稿タイプなどは対象外です。カスタム投稿を確実に対象にしたい時は、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 が返ります。
原因を切り分けるための一時的な確認コードです。ローカルなどの検証環境だけで使い、確認後は削除してください。
$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なら、タクソノミー名、タームスラッグ、relation、operatorが意図どおりか確認します。
アーカイブURLが出ない場合は登録設定を見る
テンプレート内の new WP_Query() ではなく、カスタム投稿アーカイブのURLが表示されない、404になる、タクソノミーアーカイブで投稿が出ない、という場合は、WP_Queryの書き方だけではなく、カスタム投稿タイプの登録設定も確認します。
register_post_type()のpublicは、投稿タイプが管理画面や読者側にどう見えるかに関係する複数の設定へ影響します。公式リファレンスでは、publicをtrueにすると、個別指定がない場合のexclude_from_search、publicly_queryable、show_in_nav_menus、show_uiも公開側の初期値になります。publicがfalseなら、これらは非公開側の初期値になります。
| 見ている画面 | 関係しやすい設定 | 補足 |
|---|---|---|
| テンプレート内の独自WP_Query | post_type、post_status、絞り込み条件 | まず最小構成で確認する |
| カスタム投稿アーカイブURL | has_archive、rewrite、publicly_queryable | URL側の表示設定を確認する |
| 検索結果に出ない | 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_typeとpost_statusはWP_Query、公開範囲はregister_post_type()、登録の有無はget_post_type_object()、メインクエリの変更はpre_get_postsの公式資料で確認します。
公式リンク
公式ドキュメント
最後に確認したいこと
最小構成で表示されるなら追加条件、0件ならスラッグ、公開状態、登録状態を調べます。アーカイブや個別URLの404は独自クエリと分けて、登録設定とリライトルールを確認してください。
カスタム投稿の最終判断
- 投稿タイプが登録済みで公開対象になっている
- 独自クエリとアーカイブURLの問題を分けた
- 分類・メタ条件を戻した後の対象件数を比較した
- pre_get_postsの対象範囲を限定した
- サブループ後に本来の記事情報へ戻ることを確認した
この記事の検証情報
検証環境
- WordPress
- 7.1
- PHP
- 8.3.33
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年9月11日 初回公開
この記事を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。



