post_typeは取得したい種類から決める
通常の投稿ならpost、固定ページならpage、カスタム投稿なら登録されている投稿タイプのキーを指定します。複数を扱う場合は配列で明示するのが基本です。
anyは「すべての投稿タイプ・投稿状態」という意味ではありません。リビジョンや検索対象外の投稿タイプなどは含まれず、投稿状態はpost_statusで別に指定します。
post_typeは表示場所ではなく取得対象を決める
post_typeは、WP_Queryが「どの種類のコンテンツを探すか」を決める引数です。トップページに表示するからpost、固定ページの中に表示するからpage、という意味ではありません。表示場所ではなく、取得したいデータの種類で選びます。
指定しない場合の取得対象は通常postです。ただし、tax_queryを指定したクエリでは既定値がanyになります。カテゴリーやカスタムタクソノミーで絞り込む場合も、対象を限定したいならpost_typeを明示してください。tax_queryの組み方はtax_queryの基本で詳しく確認できます。
| 指定値 | 取得対象 | 主な用途 | 注意点 |
|---|---|---|---|
| post | 通常の投稿 | ブログ・お知らせの一覧 | 固定ページは含まれない |
| page | 固定ページ | 子ページや案内ページの一覧 | 通常の投稿とは別扱い |
| カスタム投稿タイプのキー | event、book、newsなど | イベント・商品・事例の一覧 | 表示名やURL用slugとは限らない |
| 配列 | 指定した複数の投稿タイプ | 複数種類をまとめた一覧 | 件数・並び順・絞り込み条件は共通 |
| any | 広い範囲の投稿タイプ | サイト内検索や横断一覧 | revisionや検索対象外の投稿タイプは含まれない |
| attachment | 画像やPDFなどの添付ファイル | メディア一覧 | post_statusにも注意する |
判断の軸は表示場所ではなく取得対象です。 anyは無条件の全件取得ではなく、attachmentではpost_statusも確認してください。
最初に共通の完成コードを確認する
まずは、通常の投稿を5件取得してタイトルのリンクを表示する完成形を確認します。後の節では、同じループを繰り返さず、変更する$argsだけを示します。クエリ全体の読み方を先に確認したい場合はWP_Queryの基本構文を参照してください。
クラシックテーマのテンプレート(またはテンプレートパーツ)で、一覧を表示したい位置に置く例です。投稿本文やfunctions.phpへ、そのまま貼るコードではありません。
$args = [ 'post_type' => 'post', 'posts_per_page' => 5,]; $post_type_query = new WP_Query( $args ); if ( $post_type_query->have_posts() ) { echo '<ul>'; while ( $post_type_query->have_posts() ) { $post_type_query->the_post(); echo '<li><a href="' . esc_url( get_permalink() ) . '">'; echo esc_html( get_the_title() ); echo '</a></li>'; } echo '</ul>';} else { echo '<p>投稿は見つかりませんでした。</p>';} wp_reset_postdata();このコードで取得対象を決めているのが’post_type’ => ‘post’です。posts_per_pageは投稿タイプごとではなく、クエリ全体の取得件数を表します。
値ごとの違いと$argsの書き方
postは通常の投稿を取得する
ブログ記事やお知らせを通常の投稿として管理している場合はpostを指定します。上の完成コードがそのまま基本形です。固定ページやカスタム投稿タイプは含まれません。
pageは固定ページを取得する
固定ページだけを取得する場合はpageを指定します。親ページに属する子ページを並べるときはpost_parent、管理画面で設定した順番を使うときはorderby => ‘menu_order’も検討します。
引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。
$args = [ 'post_type' => 'page', 'posts_per_page' => 5, 'orderby' => 'menu_order', 'order' => 'ASC',];カスタム投稿タイプは登録キーを指定する
カスタム投稿を取得するときは、register_post_type()の第1引数に使われている投稿タイプのキーを指定します。管理画面で「イベント」と表示されていても、登録キーがeventなら指定する値はeventです。
引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。
$args = [ 'post_type' => 'event', 'posts_per_page' => 6,];投稿タイプのキーは、テーマやプラグインにあるregister_post_type()の第1引数で確認するのが確実です。投稿タイプ作成プラグインを使っている場合は、その設定画面や公式資料を確認します。管理画面URLのpost_type=以降も手掛かりになりますが、登録設定と照合してください。
投稿タイプの登録キー、rewriteで設定するURL用slug、個別記事のslugは別の値にできます。WP_Queryへ指定するのは投稿タイプの登録キーです。
キーを指定しても表示されない場合は、公開状態や登録設定も確認します。
複数の投稿タイプは配列で明示する
通常の投稿とカスタム投稿をまとめて取得する場合は、post_typeへ配列を指定します。
引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。
$args = [ 'post_type' => [ 'post', 'news' ], 'posts_per_page' => 10,];この例は、postとnewsを合わせて最大10件取得します。投稿タイプごとに10件ではありません。並び順やカテゴリーなどの条件も両方へ共通して適用されるため、混在させる前に共通の基準で表示できるかを確認しましょう。
anyは便利だが万能な全部指定ではない
anyは、複数の投稿タイプを広く対象にする指定です。ただし、リビジョンとexclude_from_searchがtrueの投稿タイプは対象外です。あとから検索対象のカスタム投稿タイプが追加されると、意図せず一覧へ混ざる可能性もあります。
引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。
$args = [ 'post_type' => 'any', 'posts_per_page' => 10,];なお、post_type => ‘any’は投稿タイプの範囲、post_status => ‘any’は投稿状態の範囲を指定します。どちらも文字どおりの「全件」ではなく除外対象があるため、取得要件が決まっているなら値を明示する方が意図を保ちやすくなります。
attachmentは状態と種類も絞り込む
画像やPDFなどはattachmentという投稿タイプです。添付ファイルは通常inheritという投稿状態で扱われるため、post_statusも合わせて指定します。画像だけを対象にするならpost_mime_typeも使えます。
引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。
$args = [ 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_mime_type' => 'image', 'posts_per_page' => 10,];post_typeを決める順番
最初からanyを選ぶのではなく、取得したいコンテンツを言葉にしてから値へ置き換えると、指定ミスを減らせます。
迷ったときの判断順
- 1通常の投稿だけならpostを指定する
- 2固定ページだけならpageを指定する
- 3カスタム投稿なら登録キーを確認して指定する
- 4複数を混ぜるなら配列で明示する
- 5横断検索など必要な場合だけanyを検討する
WP Query Builderでは、Post Typeでpost、page、any、custom(手入力)を選べます。複数のカスタム投稿タイプは手入力欄へカンマ区切りで指定します。Builderでanyを選んだ場合も除外条件は同じで、投稿状態はPost Statusで別に決めます。
通常の投稿と事例だけを出したいなら、anyではなく[ ‘post’, ‘case_study’ ]のように配列で書くと、後から読んだ人にも意図が伝わります。対象が増えたときも、変更箇所を追いやすくなります。
表示されない・混ざる時の確認ポイント
post_typeの間違いは、エラーではなく「0件になる」「必要な投稿が出ない」「別の投稿が混ざる」という形で現れやすい問題です。まずpost_typeだけの最小構成で取得できるか確認し、その後に分類や並び順の条件を戻します。
| 症状 | よくある原因 | 確認すること |
|---|---|---|
| 固定ページが表示されない | postのままになっている | pageを指定する |
| カスタム投稿が表示されない | 表示名やURL用slugを指定している | 登録キーと公開状態を確認する |
| 想定外の投稿が混ざる | anyや配列の対象が広い | 必要な投稿タイプだけを明示する |
| 複数指定で件数が合わない | 投稿タイプごとの件数だと考えている | posts_per_pageは合計件数として確認する |
| 添付ファイルが出ない | post_statusを指定していない | inheritと必要なmime typeを確認する |
条件を減らしても0件なら、投稿が表示されない時のチェックリストで、クエリの実行・公開状態・ID・分類条件を順番に切り分けてください。
公式資料で仕様を確認する
anyの除外対象、添付ファイルの投稿状態、カスタム投稿タイプの登録設定は、サイト構成によって結果へ影響します。迷ったときは次の公式資料で確認してください。
公式リンク
公式ドキュメント
取得対象を明示してから条件を加える
post_typeは、WP_Queryで取得するコンテンツの種類を決めます。通常の投稿はpost、固定ページはpage、カスタム投稿は登録キー、複数は配列で指定します。
anyは横断検索では便利ですが、すべてを無条件に取得する値ではありません。まず必要な投稿タイプを明示し、取得できることを確認してから分類や並び順の条件を加えると、原因を切り分けやすくなります。
実装後に確認すること
- 必要な投稿タイプだけが表示される
- 不要な投稿タイプが混ざらない
- 複数指定の表示件数を合計で確認した
- 公開状態の違う投稿が意図せず含まれない
- attachmentは実際のmime typeと状態で確認した
この記事の検証情報
検証環境
- WordPress
- 7.1
- PHP
- 8.3.33
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年8月20日 初回公開
この記事を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。


