本文へ移動

トラブルシュート

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

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

Huddly Huddly 投稿日: 2026年9月11日 更新日: 2026年9月12日 読了目安: 6分

最初に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件になる場合は、条件を外す順番をまとめた投稿が表示されない時のチェックリストから切り分ける方が早いです。

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

確認する順番

  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_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には貼りません。確認が終わったら、不要になった呼び出しとファイルを外してください。

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

PHPtemplate-parts/works-check.php登録キーworksの公開済み投稿を最大3件表示する確認用パーツ
<?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件メッセージを表示するサイト
指定を間違えた例workでは対象の投稿がない

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

post_typeをworksに直すと投稿ID18、17、16の3件が表示されるサイト
登録キーを合わせた例worksでは公開済み3件が出る

本文のコードどおり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 の先頭で判定しないでください。

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

PHPtemplate-parts/debug-post-type.php投稿タイプworksの登録有無をテンプレートから確認するパーツ
<?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_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 を使っている場合、意図せず別のクエリにも条件が効いていることがあります。たとえば、メインクエリ用に書いたつもりの条件が、管理画面や別の一覧にも影響してしまうと、カスタム投稿が出ないように見えることがあります。

メインクエリだけを変えるなら、管理画面を除外し、フックで受け取った $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の対象範囲を限定した
  • サブループ後に本来の記事情報へ戻ることを確認した
WP Query BuilderBuilderで条件を組み直す条件を選び、WP_Queryのコードを画面で作れます。Builderでクエリを作る

この記事を書いた人

Huddly

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

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

この記事の検証情報

検証環境

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

更新履歴

  • 2026年9月12日 本文と補助情報を更新
  • 2026年9月11日 初回公開

この記事を活用する

あとで見返す・共有する

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

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