最初に検索方法・フィールド名・保存値を分ける
WordPress標準検索のsが探すのは、基本的に投稿タイトル・抜粋・本文です。
ACFの値で絞り込むならmeta_queryを使います。keyには通常、ラベル「地域」やfield_…ではなくフィールド名areaを、valueには画面表示ではなく保存値tokyoを指定します。まず完全一致を試し、次にcompare、type、保存形式を確認します。標準検索との違い、フィールド名、保存値の順に見ていきます。
症状を標準検索・ACF絞り込み・型の比較に分ける
最初に分けたいのは、「サイト内検索でACFの文字が見つからない」のか、「ACFの条件を付けた一覧が0件になる」のかです。さらに、数値や日付の大小を比べたい場合は、文字列の完全一致とは確認方法が変わります。
| 症状 | 最初に疑う場所 | 確認すること |
|---|---|---|
| キーワード検索でACFの値が引っかからない | 検索対象 | s だけでACFのpost metaを探そうとしていないか |
| meta_queryで1件も出ない | メタキー名と保存値 | ACFのフィールド名と実際の保存値が一致しているか |
| 一部の値だけ出ない | compare | 完全一致、LIKE、IN、BETWEENの選び方が合っているか |
| 数値や日付の条件が効かない | type / 保存形式 | 文字列として比較していないか、日付の保存形式が想定どおりか |
| チェックボックスや関連投稿で出ない | フィールドタイプ | 配列やIDの保存形式に合った検索になっているか |
ACFの画面に見えている値と、meta_queryが比較するpost metaの保存値は同じとは限りません。get_field()の返り値だけで判断せず、保存値を確認してから条件を書きます。
sパラメータとACFの値検索を混同しない
sは検索キーワードを受け取り、標準では投稿タイトル・抜粋・本文を探します。たとえばACFの「地域」に東京と入力しても、その文字がタイトル・抜粋・本文に書かれていなければ、s => ‘東京’だけでは見つかりません。
タイトル・抜粋・本文のどこを探すか選ぶsearch_columnsと、投稿メタを条件にするmeta_queryは別の仕組みです。検索対象列を絞る方法とmeta_queryの基本を分けて確認すると、どこに条件を書くべきか判断しやすくなります。
sとmeta_queryを同時に指定すると、通常は両方に合う投稿だけになります。「本文またはACFのどちらかにあれば出す」というOR検索にはなりません。ACFの条件だけを試すときは、いったんsを外してください。
最初にメタキー名と保存値を確認する
ACFの値で絞り込む時に最初に確認したいのは、key に指定している名前です。ACFの管理画面には「フィールドラベル」「フィールド名」「field key」がありますが、WP_Queryの meta_query に指定するのは、実際のpost metaのキーです。通常のACFフィールドなら、ラベル「地域」やfield_…で始まるfield keyではなく、フィールド名areaを使います。
「フィールドラベル」は人が読む表示名、「フィールド名」はpost metaのキー、「field key」はACFがフィールド設定を識別する値です。通常、meta_queryのkeyにはフィールド名を指定します。| 画面・設定の項目 | この例 | meta_queryでの扱い |
|---|---|---|
| フィールドラベル | 地域 | 編集画面で人が読む名前。通常はkeyに使わない |
| フィールド名 | area | post metaのキーとしてkeyに指定する |
| field key | field_... | ACFがフィールド設定を識別する名前。通常はkeyに使わない |
| 選択肢の表示 | 東京 | 編集画面で人が読む値。保存値と異なる場合がある |
| 選択肢の値 | tokyo | 保存値を確認し、valueに指定する |
次に、対象投稿へ値が保存されているかを見ます。投稿タイプや投稿ステータスを取り違えたり、フィールドグループの表示条件が別の投稿タイプに向いていたりすることもあります。ACFの設定画面、投稿編集画面、get_post_meta()の順で確認すると、画面表示と保存値を分けて追えます。

実際のSelectフィールド設定。名前はarea、選択肢はtokyo : 東京。撮影では関連設定へ範囲を絞っています。

地域の選択欄には東京と表示されます。ここで選ばれている値はtokyoです。
条件を減らした最小例で確認する
原因を切り分ける時は、最初から複雑なmeta_queryを書かず、投稿タイプ、投稿ステータス、メタキー、値の4つだけに絞ります。まず1件でも返るかを確認すると、どの条件で結果が消えたか追いやすくなります。
ここでは、カスタム投稿タイプworksのうち、単一選択のareaにtokyoが保存されている投稿を完全一致で出します。クラシック子テーマのtemplate-parts/acf-area-list.phpへ保存し、表示したいテンプレートのメインループ内でthe_post()の後にget_template_part( ‘template-parts/acf-area-list’ );を呼んでください。投稿本文やfunctions.phpの直下へ貼るコードではありません。
works、area、tokyoは自分の登録キー・フィールド名・保存値へ置き換えます。通常投稿ならpost_typeをpostにします。ブロックテーマのHTMLテンプレートではPHPを直接実行できないため、この例はPHPテンプレートを使える検証環境向けです。
現在のWP Query Builder実画面で、詳細モードから「投稿タイプ: カスタム / works」「ステータス: publish」「件数: 5」「並び順: DESC / date」を指定し、Meta Queryへarea、tokyo、=を入力しました。自動最適化はオフです。そこで生成された次の$argsは編集せず使用し、その後のループ、0件時の文、投稿IDと保存値の表示、wp_reset_postdata()は用途に合わせて手動で追加しています。
クラシックテーマのテンプレート(またはテンプレートパーツ)で、一覧を表示したい位置に置く例です。投稿本文やfunctions.phpへ、そのまま貼るコードではありません。
<?php$args = array( 'post_type' => 'works', 'post_status' => 'publish', 'posts_per_page' => 5, 'order' => 'DESC', 'orderby' => 'date', 'meta_query' => array( array( 'key' => 'area', 'compare' => '=', 'value' => 'tokyo' ) )); $acf_query = new WP_Query( $args ); if ( $acf_query->have_posts() ) { echo '<ul>'; while ( $acf_query->have_posts() ) { $acf_query->the_post(); printf( '<li><a href="%s">%s</a>(ID: %d / area: %s)</li>', esc_url( get_permalink() ), esc_html( get_the_title() ), get_the_ID(), esc_html( get_post_meta( get_the_ID(), 'area', true ) ) ); } echo '</ul>';} else { echo '<p>条件に合う地域の情報はありません。</p>';} wp_reset_postdata();keyにはACFのフィールド名、valueには保存値を入れます。選択肢がtokyo : 東京なら、表示される「東京」ではなくtokyoが保存されている場合があります。この例は公開日時の降順ですが、同じ公開日時の投稿同士まで順番を固定するものではありません。
まずcompareを=にして、出ない時はLIKEへ変える前に保存値を確かめます。東京では0件、tokyoでは2件になる表示例
次の例では、公開済みのworksが3件あり、ID17・18のareaはtokyo、ID16はosakaです。本文コードの表示はID18・17の2件。valueだけを東京へ変えると0件メッセージになります。IDの数字はサイト固有なので、自分の投稿と保存値へ置き換えて見比べます。

どちらの行もarea: tokyo。ラベルの東京ではなく保存値で絞り込み、結果にも保存値を表示しています。
| 指定 | この例の結果 | 理由 |
|---|---|---|
| meta_queryでarea = 東京 | 0件 | ラベルは保存値と一致しない |
| meta_queryでarea = tokyo | ID18・17 | 保存値の完全一致 |
| s = tokyoだけ | 0件 | タイトル・抜粋・本文にはtokyoがない |
| area = tokyoとs = tokyoを併記 | 0件 | 地域条件に合っても標準検索の条件に合わない |
フィールド設定や保存値を調べる間は、本番と分けた環境を使います。サーバー上にも試す場所が必要なら、XserverのPHP対応やバックアップ条件を確認できます。
保存値と検索条件を順に確認する
最小例でも結果が合わない場合は、保存値を確認してからcompare、type、フィールド形式を合わせます。チェックボックス、複数選択、関連投稿、日付、真偽値は、表示と保存値の形が違うことがあります。
保存値を確認する
確認用コードは本番に出しっぱなしにせず、検証環境や一時的なテンプレートで使ってください。個人情報や非公開データが入るフィールドでは、公開画面に値を出さないように注意します。
次のコードをtemplate-parts/debug-acf-meta.phpへ保存します。調べたい投稿の個別テンプレートのメインループで、the_post()の直後にget_template_part( ‘template-parts/debug-acf-meta’ );を一時的に呼んでください。別の固定ページに置いた場合は、その固定ページのIDを調べてしまいます。確認後は呼び出しとファイルを撤去します。
原因を切り分けるための一時的な確認コードです。ローカルなどの検証環境だけで使い、確認後は削除してください。
<?php$post_id = get_the_ID();$meta_key = 'area';$raw_value = get_post_meta( $post_id, $meta_key, true ); echo '<pre>';echo esc_html( var_export( [ 'post_id' => $post_id, 'exists' => metadata_exists( 'post', $post_id, $meta_key ), 'value' => $raw_value,], true ) );echo '</pre>';表示する値はesc_html()を通すため、文字列にHTMLが含まれていてもタグとして実行されません。ただし、値自体は画面に出るので、個人情報の匿名化と公開範囲の制限は必要です。
get_post_meta()の第2引数にはACFのフィールド名を入れ、第3引数をtrueにすると単一の値として取得します。
戻り値が空文字だけでは未保存か保存済みの空値かを判断しにくいため、metadata_exists()も使います。falseなら未保存、trueで値が空なら保存済みの空値です。別の投稿IDを見ていないかも確認してください。
値が配列のように見えても、比較方法は保存形式で変わります。ACF Checkboxのようなシリアライズ配列の要素を探す公式例では、値をダブルクォートで囲んでLIKEを使います。INは複数の候補値とメタ値全体を比較する指定で、シリアライズ配列の要素検索を自動で行うものではありません。

本文の確認コードの出力。post_idで対象を確認し、existsがtrue、valueがtokyoであることを読み取ります。WordPress標準の管理画面ではありません。
compare・type・フィールドタイプを合わせる
メタキー名と保存値が合っているのに検索できない場合は、compare と type を確認します。WP_Meta_Queryでは、compare に =、LIKE、IN、BETWEEN などを指定でき、type には NUMERIC、DATE、CHAR などを指定できます。何も指定しない場合、文字列として扱われる場面があるため、数値や日付では意図と違う結果になることがあります。
ただし、LIKEは便利ですが万能ではありません。たとえばredをそのまま探すとdarkredまで一致する可能性があります。シリアライズ配列の要素ならACF公式例のように'”red”‘を探し、それでも保存構造に依存する方法であることを理解して使います。
| フィールドの種類 | よくある原因 | 確認ポイント |
|---|---|---|
| Text / Select | 表示ラベルと保存値を混同している | フィールド名と選択肢のvalueを確認する |
| Number | 文字列として比較している | 数値比較では type に NUMERIC を指定する |
| Date Picker | 表示形式で検索している | ACF Date Pickerは保存形式を確認し、必要に応じて Ymd に合わせる |
| Checkbox | 複数値が配列として保存される | ACF公式例のように保存値に合わせて LIKE を使う場面がある |
| Relationship / Post Object | 投稿タイトルで検索している | 保存値がIDなのかオブジェクトとして返っているのかを確認する |
ACFのCheckbox公式ドキュメントでは、チェックボックスフィールドは選択値の配列を返し、クエリ例では保存値がシリアライズ配列であるため LIKE 比較を使うことが示されています。Date Picker公式ドキュメントでは、表示形式や返り値の形式を変えられても、データベースには Ymd 形式で保存されると説明されています。
ACF関数の戻り値の形式は、値を取得した時の返り方に影響しますが、meta_queryの比較対象そのものを決める設定ではありません。RelationshipやPost Object系フィールドも、画面に投稿タイトルが見えていても投稿IDが保存されていることがあります。検索条件は、フィールドタイプごとの保存値に合わせます。
保存値と比較方法が分かったら、WP Query Builderで同じmeta_queryを組み立てられます。生成した$argsを最初の表示ループへ渡し、条件を増やした後の投稿IDも比べます。
保存値に合うACFの条件を作る
key、value、compare、typeから$argsを作れます。Builderはデータベースの保存値を調査しないため、WordPress側で確認した値を使ってください。
切り分けは条件を1つずつ戻す
原因が分からない時は、複数条件をまとめて直すのではなく、条件を1つずつ戻していきます。投稿タイプ、投稿ステータス、ACFのメタキー、値、compare、type、並び順の順に確認すると、どこで結果が消えるか分かりやすくなります。
たとえば、最初は post_type と posts_per_page だけで投稿が出るか確認します。次に meta_query を1つだけ追加します。そこまで出るなら、複数条件の relation や、別の tax_query、date_query、検索キーワードとの組み合わせが原因かもしれません。
切り分けの順番
- 1post_typeとpost_statusだけで投稿が出るか確認する
- 2ACFのkeyだけで存在確認する
- 3valueとcompareを追加する
- 4数値・日付ならtypeを追加する
- 5最後にtax_queryやsなど他の条件を戻す
これで、ACFの条件自体が違うのか、他の条件と組み合わせた時だけ消えるのかを切り分けられます。
ACFの保存値とmeta_queryの公式資料
meta_queryの構造や比較方法はWordPress側、フィールドごとの値はACF側の公式資料で確認できます。
公式リンク
公式ドキュメント
- WP_Query ClassWP_Queryの検索パラメータ、Custom Field Parameters、標準ループを確認したい時
- WP_Meta_Querymeta_queryのkey、value、compare、typeを確認したい時
- get_post_meta()実際に保存されているpost metaの値を確認したい時
- metadata_exists()未保存と空の保存値を区別したい時
- ACF get_field()ACF関数で返る値の形式やformat_valueを確認したい時
- ACF Select選択肢の値・ラベルと戻り値の形式を確認したい時
- ACF Checkboxチェックボックスの複数値検索とLIKE比較を確認したい時
- ACF Date Picker日付フィールドの保存形式を確認したい時
最後に判断したいこと
- 検索対象が本文かACFの保存値かを分けた
- 画面上の表示ではなく実際の保存値を根拠に条件を決めた
- フィールド型に応じてcompareとtypeを選んだ
- 配列・ID・日付など保存形式の違いを見落としていない
- 他の条件を戻した後も対象件数を比較した
この記事の検証情報
検証環境
- WordPress
- 7.1.4
- PHP
- 8.3.36
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年9月15日 初回公開
この記事を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。


