本文へ移動

WP_Queryトラブルシュート

WP_Queryでカテゴリー絞り込みが効かない原因
|指定方法とtax_queryを確認

カテゴリーを指定して0件になる、別カテゴリーも混ざる時は、まず引数と指定値を確認します。category_nameにはslug、catとcategory__inにはIDを指定し、その後で子カテゴリー、tax_query、post_typeを順に調べます。

Huddly Huddly 投稿日: 2026年9月1日 読了目安: 5分

0件なら最初に引数とID・slugを確認する

まずコードの$argsを開き、WordPress管理画面の「投稿 > カテゴリー」でIDとスラッグを調べます。catcategory__inにはカテゴリーID、category_nameにはカテゴリーslugを指定します。

値が合っているのに0件や別カテゴリー混在が続く場合は、子カテゴリーを含む範囲、tax_querypost_type、追加条件の順に外して確認します。カスタムタクソノミーは通常のカテゴリー引数ではなくtax_queryで指定します。

0件・別カテゴリー混在・子カテゴリーの症状を分ける

投稿が出ない、別カテゴリまで混ざる、子カテゴリの扱いが違う、カスタム投稿だけ効かない、という症状ごとに確認先を分けます。

症状最初に疑う原因確認する場所
投稿が1件も出ないカテゴリIDとslugの取り違え、post_type違い、公開状態違い$args の cat / category_name / post_type
別カテゴリの記事も出るOR条件になっている、カテゴリ指定が広すぎる、子カテゴリを含んでいるcatcategory_nametax_query の指定
子カテゴリの記事が出たり出なかったりする子カテゴリを含む指定と含まない指定の混同cat / category_namecategory__in の違い
カスタム投稿だけ出ないその投稿タイプにカテゴリーが紐づいていない、投稿タイプ指定が違う投稿タイプ登録と post_type
カスタム分類で効かない通常のカテゴリー引数を使っているtax_querytaxonomy

カテゴリ以外のtaxonomyも含む基本構文はtax_queryの使い方で確認できます。複数条件を組み合わせている場合は、relationのAND / ORの違いも条件を1つに戻した後で確認してください。

WP_Queryのカテゴリ指定には、似た名前の引数がいくつもあります。catcategory_namecategory__incategory__andcategory__not_in は、どれもカテゴリーに関係しますが、受け取る値と動きが同じではありません。

原因1: IDとslugを取り違えている

catにはカテゴリID、category_nameにはカテゴリslugを使います。表示名が「ニュース」でslugがnewsの場合、category_nameに入れるのはnewsです。日本語の表示名をそのまま入れると、期待通りに一致しないことがあります。

表示名とslugは同じとは限りません。コードへ入れる前に、管理画面の「スラッグ」列を確認してください。

category__incategory__and も、基本的にはカテゴリIDの配列を使います。slugで指定したいなら category_name か、tax_queryfieldslug にする方法を検討します。

次の一覧では、表示名「イベント案内」の行にslugのeventsと数値のIDが別々に表示されています。自分のサイトでも同じ列を見て、コードへ渡す値を選んでください。

匿名の検証環境でカテゴリーの名前、スラッグ、IDを確認している画面
管理画面で確認名前・スラッグ・IDは別の値

category_nameには「スラッグ」列、catやcategory__inには「ID」列の値を使います。

原因2: 子カテゴリを含むかどうかを誤解している

公式リファレンスでは、catcategory_nameは子カテゴリも対象に含む指定として説明されています。一方、category__inは指定したカテゴリIDそのものを対象にし、子カテゴリを自動では含めません。

そのため、「親カテゴリだけを指定したのに子カテゴリの記事も出る」場合は catcategory_name の動きを疑います。逆に、「親カテゴリを指定したのに子カテゴリの記事が出ない」場合は category__in を使っていないか確認します。

原因3: カテゴリーではなくカスタムタクソノミーを絞り込もうとしている

通常の投稿カテゴリーは category タクソノミーです。しかし、商品ジャンル、制作実績の種類、イベント地域などを独自に作っている場合、それはカスタムタクソノミーかもしれません。

カスタムタクソノミーを通常の catcategory_name で絞り込もうとしても、意図した結果になりません。その場合は tax_querytaxonomyfieldterms を明示します。

原因4: カテゴリ以外の条件で0件になっている

カテゴリ指定だけは正しくても、post_typepost_statusmeta_querytax_query の別条件、検索キーワード、日付条件などが同時に入っていると、結果が0件になることがあります。

特に、カスタム投稿を対象にしているのにpost_typepostのままなら取得できません。カテゴリ以外の条件を外して確認します。

まず試す最小例

ここでは、通常の投稿カテゴリーをslugで絞り込む最小例を使います。テンプレートファイル内で「このカテゴリだけ取れるか」を見るための確認コードです。news はサンプルなので、実際のカテゴリslugに置き換えてください。

この段階では、meta_query や複数カテゴリ条件を足さないでください。まずは1つのカテゴリだけで取得できるかを確認します。

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

PHPcategory-check.phpカテゴリslugで投稿を絞り込めるか確認する最小例
$args = [   'post_type'      => 'post',   'posts_per_page' => 5,   'category_name'  => 'news',]; $category_query = new WP_Query( $args ); if ( $category_query->have_posts() ) {   while ( $category_query->have_posts() ) {      $category_query->the_post();      echo esc_html( get_the_title() ) . '<br>';   }   wp_reset_postdata();} else {   echo '指定したカテゴリの投稿は見つかりませんでした。';}

このコードのポイントは、category_nameにカテゴリの表示名ではなくslugを入れている点です。また、posts_per_pageを小さくして、条件が効いているかを確認しやすくしています。

この最小例で投稿が出るなら、カテゴリslug自体は合っている可能性が高いです。次は、元のコードに戻して、追加している条件のどれが結果を変えているかを1つずつ戻します。

原因別の対処法

同じ「カテゴリ絞り込み」と言っても、IDで指定したいのか、slugで指定したいのか、子カテゴリを含めたいのかで選ぶ引数が変わります。

IDで指定するか、slugで指定するかを決める

カテゴリIDで絞り込むなら cat または category__in を使います。slugで絞り込むなら category_name が分かりやすいです。

やりたいこと使う引数指定する値
カテゴリID 4 の投稿を出すcat4
slug が news の投稿を出すcategory_namenews
ID 2 または 6 の投稿を出すcategory__inarray( 2, 6 )
ID 2 と 6 の両方に属する投稿を出すcategory__andarray( 2, 6 )
カテゴリID 2 と 6 を除外するcategory__not_inarray( 2, 6 )

category__and は「どちらか」ではなく「両方」です。ここを勘違いすると、投稿が急に少なくなったり、0件になったりします。複数カテゴリの条件では、まず OR なのか AND なのかを言葉で確認しましょう。

category_nameでも複数のslugを指定できます。news,eventsはどちらかのカテゴリー、news+eventsは両方のカテゴリーに属する投稿が対象です。条件が増えて読みづらくなる場合や、子カテゴリーを含める範囲まで明示したい場合は、category__incategory__and、またはtax_queryを使うと意図を追いやすくなります。

tax_queryでカテゴリーを指定する

複数条件に発展しそうな場合や、カテゴリー以外のタクソノミーも一緒に扱う場合は、tax_query で書くと意図を明示しやすくなります。

次のコードは、通常のカテゴリーを tax_query で絞り込む例です。taxonomycategoryfieldslugterms にカテゴリslugを指定しています。

クラシックテーマのテンプレート(またはテンプレートパーツ)で、一覧を表示したい位置に置く例です。投稿本文やfunctions.phpへ、そのまま貼るコードではありません。

PHPcategory-tax-query.phptax_queryで通常のカテゴリーをslug指定する例
$args = [   'post_type'      => 'post',   'posts_per_page' => 5,   'tax_query'      => [      [         'taxonomy' => 'category',         'field'    => 'slug',         'terms'    => [ 'news' ],         'operator' => 'IN',         'include_children' => false,      ],   ],]; $category_query = new WP_Query( $args );

このコードのポイントは、taxonomyfieldに加え、operatorinclude_childrenも明示している点です。operator => ‘IN’は指定タームのいずれかに属する投稿、include_children => falseは子タームを自動で含めない指定です。tax_queryinclude_childrenは既定でtrueなので、親だけに限定したい時は意図をコードに残します。

slugに自信がない場合は、管理画面のカテゴリー一覧、get_category_by_slug()get_term_by()のいずれかで、対象タームが存在するか確認します。

カスタム投稿でカテゴリが出ない場合

カスタム投稿タイプで通常のカテゴリーを使いたい場合、その投稿タイプがcategoryタクソノミーに登録されている必要があります。register_post_type()taxonomies、またはregister_taxonomy_for_object_type()で関連付けられていないと、管理画面でカテゴリを付けられず、クエリ条件だけ直しても対象投稿は増えません。

WP_Query側でもpost_typeを対象の投稿タイプにする必要があります。通常投稿だけを対象にしたままでは、カスタム投稿は検索対象に入りません。

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

PHPcustom-post-category-check.phpカスタム投稿タイプでカテゴリーを絞り込む確認例
$args = [   'post_type'      => 'works',   'posts_per_page' => 5,   'category_name'  => 'news',]; $works_query = new WP_Query( $args );

このコードのポイントは、post_typeworksに変えている点です。ただし、これは投稿タイプworksが通常のカテゴリーを使える前提の例です。対象投稿IDにwp_get_post_terms( $post_id, ‘category’ )を使い、実際にカテゴリが割り当てられているかも確認してください。

切り分けの順番

カテゴリ絞り込みが効かないときは、複雑なコードを何度も書き換えるより、条件を減らしてから1つずつ戻す方が原因を特定しやすくなります。特にtax_querymeta_query、ページネーション、pre_get_postsが絡んでいると、どれが原因か分かりにくくなります。

次の順番で確認すると、カテゴリ指定そのものの問題か、それ以外の条件の問題かを分けやすくなります。

切り分け手順

  1. 1
    対象カテゴリのslugとIDを管理画面で確認する
  2. 2
    対象投稿IDに実際のカテゴリが割り当てられているか確認する
  3. 3
    post_type => postcategory_name だけの最小例で試す
  4. 4
    表示されたら元コードの条件を1つずつ戻す
  5. 5
    カスタム投稿なら投稿タイプとタクソノミーの関連付けを確認する
  6. 6
    tax_queryではoperatorとinclude_childrenを要件に合わせる
  7. 7
    メインクエリならpre_get_postsの条件分岐を確認する

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

カテゴリまわりの引数は、公式リファレンスのWP_Queryページにまとまっています。特にcatcategory_namecategory__incategory__andcategory__not_inの違いは、本文と公式資料を照らし合わせると対象範囲を判断しやすくなります。

tax_query を使う場合は、WP_Query内のTaxonomy Parametersと、WP_Tax_Queryのページも確認しておくと、fieldtermsoperatorinclude_children の意味を追いやすくなります。

公式リンク

公式ドキュメント

最後のチェックリスト

IDとslug、子カテゴリ、カスタムタクソノミーを確認しても結果が違う場合は、別のtax_querymeta_querypre_get_posts、テンプレート側のループを1つずつ戻します。

カテゴリ絞り込みの最終判断

  • 標準カテゴリとカスタムタクソノミーを取り違えていない
  • IDとslugのどちらを渡す引数か確認した
  • 子カテゴリを含む範囲が要件と合っている
  • 他の条件を戻した後も件数と対象投稿を比較した
  • サブループ後の表示が崩れないことを確認した
WP Query BuilderBuilderで条件を組み直す条件を選び、WP_Queryのコードを画面で作れます。Builderでクエリを作る

この記事を書いた人

Huddly

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

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

この記事の検証情報

検証環境

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

更新履歴

  • 2026年9月1日 初回公開

この記事を活用する

あとで見返す・共有する

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

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