最初に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が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 だけにして確認します。この例は works という登録キーを使い、そこに入っている公開済みの開催情報を最大3件表示します。自分のサイトでは実際の登録キーへ置き換え、カテゴリー、カスタムフィールド、日付などの追加条件をいったん外してください。
現在のWP Query Builderで、投稿タイプを「custom」、カスタム投稿タイプを「works」、公開状態を「publish」、件数を「3」にし、自動高速化をオフにして生成した未編集の$argsを使います。Builderが作るのは取得条件までで、表示ループ、0件時の文言、投稿IDの表示、wp_reset_postdata()は手動で追加しています。
PHPテンプレートを使う子テーマの template-parts/works-check.php に保存し、表示したいテンプレートのメインループで the_post() の後に get_template_part( ‘template-parts/works-check’ ); と呼びます。投稿本文や追加CSSには貼りません。確認が終わったら、不要になった呼び出しとファイルを外してください。
原因を切り分けるための一時的な確認コードです。ローカルなどの検証環境だけで使い、確認後は削除してください。
<?php$args = array( 'post_type' => 'works', 'post_status' => 'publish', 'posts_per_page' => 3); $works_query = new WP_Query( $args ); if ( $works_query->have_posts() ) { echo '<ul>'; while ( $works_query->have_posts() ) { $works_query->the_post(); echo '<li><a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a>'; echo '<br>投稿ID:' . esc_html( (string) get_the_ID() ) . '</li>'; } echo '</ul>';} else { echo '<p>条件に合う公開済みの情報はありません。</p>';} wp_reset_postdata();最小構成で表示されるなら、原因は外した条件のどれかです。 tax_query、meta_query、orderby、pagedを1つずつ戻します。0件のままなら、スラッグ、公開状態、投稿タイプの登録状態を調べてください。
workとworksの1文字の違いで結果を比べる
同じ3件の投稿に対し、上の post_type だけを変えています。このサンプルでは works に公開済み3件があり、work の投稿はありません。ループ・件数・公開状態は同じです。

post_typeだけをworkに変更した結果は0件。この表示だけでは、登録キーの間違いか、公開済み投稿がないのかまでは分かりません。

本文のコードどおりworksを指定すると、ID18・17・16の3件が表示されます。先に取得条件を合わせ、追加の分類やメタ条件はその後で戻します。
投稿タイプの設定や表示コードを調べる作業は、本番と分けた環境で行います。サーバー上へ試す場所を用意する場合は、XserverのPHP対応やバックアップ条件も確認できます。
カスタム投稿が出ない原因を順に確認する
最小構成で結果を確認したら、投稿タイプ名、公開状態、登録設定、外部処理の順に実際の条件へ戻します。
post_typeのスラッグ違いを確認する
管理画面の「イベント」のような表示名、投稿タイプの登録キー、公開URLの rewrite[‘slug’] は別々に設定できます。WP_Queryへ渡すのは登録キーです。
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 が返ります。
次を template-parts/debug-post-type.php に保存し、先ほどと同じテンプレートから get_template_part( ‘template-parts/debug-post-type’ ); と一時的に呼びます。通常は init で登録されるため、その後に実行されるテンプレートで確認します。読み込み途中の functions.php の先頭で判定しないでください。
原因を切り分けるための一時的な確認コードです。ローカルなどの検証環境だけで使い、確認後は削除してください。
<?php$checked_post_type = 'works';$post_type_object = get_post_type_object( $checked_post_type ); if ( $post_type_object ) { echo '<p>' . esc_html( $checked_post_type . ' は登録されています。' ) . '</p>';} else { echo '<p>' . esc_html( $checked_post_type . ' は登録されていません。' ) . '</p>';}「登録されていません」と出たら、投稿タイプ名、登録処理の読み込み順、CPTを登録するプラグインの有効化状態を確認します。確認後はこのパーツの呼び出しとファイルも外します。
なお、データベースに投稿が残っていれば、未登録の投稿タイプでも明示した独自クエリで取得できる場合があります。「一覧に出た」ことだけでは、投稿タイプの登録や個別URLまで正常とは判断できません。
公開状態と絞り込み条件を確認する
post_type が正しくても、対象の投稿が下書き、予約投稿、非公開などになっていると、通常の公開ページでは期待通りに出ないことがあります。WP_Queryの post_status は、特に指定しない場合は基本的に公開済み投稿を対象にするものとして考えると分かりやすいです。
公開ページでは post_status => ‘publish’ を明示して確認します。下書きや非公開の有無は権限のある管理画面で調べ、表示を出すために any へ広げたり、公開予定でない投稿を公開したりしないでください。
| 確認項目 | 原因になりやすい状態 | 対処 |
|---|---|---|
| 公開状態 | 下書き、予約投稿、非公開になっている | 管理画面で状態を確認する |
| 投稿件数 | 対象のカスタム投稿がまだ0件 | 本番と分けた環境でテスト投稿を用意する |
| tax_query | タームのスラッグやtaxonomy名が違う | 条件を外してから戻す |
| meta_query | メタキーや値の形式が違う | 条件を外してから値を確認する |
| date_query | 日付条件の範囲外になっている | 日付条件なしで確認する |
条件を足した直後に0件になったなら、その条件を調べます。たとえばtax_queryなら、タクソノミー名、タームスラッグ、relation、operatorが意図どおりか確認します。
登録キーと公開状態で取得できたら、WP Query Builderで次の絞り込みを組み立てられます。生成した$argsを最初の表示ループへ渡し、条件を1つ加えるごとに対象の投稿IDを見比べます。
カスタム投稿の取得条件を作る
投稿タイプ・公開状態・件数・絞り込みから$argsを作れます。投稿タイプの登録とURL設定は、WordPress側で別に確認してください。
アーカイブURLが出ない場合は登録設定を見る
テンプレート内の new WP_Query() ではなく、カスタム投稿アーカイブのURLが表示されない、404になる、タクソノミーアーカイブで投稿が出ない、という場合は、WP_Queryの書き方だけではなく、カスタム投稿タイプの登録設定も確認します。
public を true にすると、個別指定がない場合の publicly_queryable・show_ui・show_in_nav_menus は true、exclude_from_search は逆の false になります。ただし各設定は個別に上書きでき、has_archive が自動的に true になるわけではありません。
この記事の works は has_archive => false ですが、最初の独自クエリでは3件取得できます。アーカイブを持つかどうかと、テンプレート内の独自クエリで取得できるかは別の確認です。 公開設定を変える場合も、下書きや内部用途の投稿を読者へ見せない要件を先に確認します。
| 見ている画面 | 関係しやすい設定 | 補足 |
|---|---|---|
| テンプレート内の独自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 を使っている場合、意図せず別のクエリにも条件が効いていることがあります。たとえば、メインクエリ用に書いたつもりの条件が、管理画面や別の一覧にも影響してしまうと、カスタム投稿が出ないように見えることがあります。
メインクエリだけを変えるなら、管理画面を除外し、フックで受け取った $query->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.4
- PHP
- 8.3.36
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年9月12日 本文と補助情報を更新
- 2026年9月11日 初回公開
この記事を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。




