2026年6月23日
2026年6月23日
Advanced Custom Fieldsでフィールドが表示されないときの修正方法(編集画面・サイト表示別)
Advanced Custom Fields(ACF)で「フィールドが表示されない」というとき、実際には2つの別の問題があります。1つは投稿の編集画面にフィールドの入力欄が出てこない問題、もう1つは値を入力したのにサイトの表示に出てこない問題です。前者はフィールドグループの設定、後者はテーマのテンプレートに書いたコードが主な原因です。この記事では、2つを分けて原因の候補を挙げ、確認方法と直し方を説明します。
作業前の準備
フィールドグループの設定変更やテーマファイルの編集を行う前に、サイトのバックアップを取ります。テーマを編集する場合は、テーマの更新で変更が消えないよう子テーマで作業し、編集前のファイルを保存しておきます。本番サイトで直接テンプレートを書き換えるとエラーで表示が崩れることがあるため、可能であればステージング環境で試します。
編集画面にフィールドが出てこない場合
フィールドグループが有効になっているか
管理画面の「ACF」→「フィールドグループ」を開き、対象のフィールドグループが一覧に表示されているか、有効(アクティブ)になっているかを確認します。無効になっているフィールドグループは、どの編集画面にも表示されません。インポートや複製の直後に無効のままになっている例がよくあります。
位置ルールが編集中の画面に合っているか
フィールドグループの編集画面にある「位置」(ロケーションルール)が、フィールドを表示する条件です。(2026年10月現在)のACFでは「投稿タイプ」「ページテンプレート」「投稿カテゴリー」、ユーザーの権限などの条件を組み合わせられます。次のような食い違いがよく起きます。
- 投稿タイプを「投稿」にしているが、実際に編集しているのは固定ページやカスタム投稿タイプ
- 「ページテンプレート」を条件にしているのに、編集中のページで別のテンプレートを選んでいる
- 複数の条件を「かつ(and)」でつないでいて、すべてを同時に満たす画面が存在しない
「かつ」は同じルールグループ内の条件、「または(or)」は別のルールグループとして追加します。どちらか一方の条件で表示したい場合に「かつ」でつないでしまうと、どの画面にも表示されなくなります。
カテゴリーやテンプレートを条件にしている場合、ブロックエディターでは条件を変更しても、保存して画面を再読み込みするまでフィールドの表示が切り替わらないことがあります。条件を変えたら一度保存して再読み込みし、表示を確認します。
ブロックエディターのパネル設定で隠れていないか
ブロックエディターでは、ACFのフィールドは画面下部の「メタボックス」の領域に表示されます。エディター右上のオプションメニューから「設定」(または「環境設定」)を開くと、表示するパネルを選ぶ項目があり、ここでフィールドグループがオフになっていると表示されません。この設定はユーザーごとに保存されるため、他のユーザーには見えて自分だけ見えない、という症状の原因になります。
カスタム投稿タイプやフィールドの種類に原因がないか
カスタム投稿タイプで位置ルールが合っているのに出ない場合は、投稿タイプを登録しているプラグインやテーマのコードに、編集画面のメタボックスを削除する処理(remove_meta_box() など)がないかを確認します。
また、リピーター、フレキシブルコンテンツ、ギャラリー、オプションページはACF PROの機能です。PROで作ったフィールドグループを無料版のサイトに移した場合や、PROのライセンスが切れてプラグインが無料版に置き換わった場合、これらのフィールドは使えません。
ローカルJSONとの同期
テーマ内の acf-json フォルダでフィールドグループをファイル管理している場合、ファイルとデータベースの内容が食い違っていることがあります。フィールドグループの一覧に同期が必要であることを示す表示が出ていれば、内容を確認してから同期します。Gitなどで別の環境からファイルだけを持ち込んだときに起きやすい問題です。
値を入力したのにサイトに表示されない場合
get_fieldの値を出力しているか
テンプレートで最も多い間違いは、get_field() と the_field() の使い分けです。get_field() は値を返すだけで画面には出力しないため、echo が必要です。出力するときは、フィールドの種類に応じてエスケープします。
<?php
$catch_copy = get_field( 'catch_copy' );
if ( $catch_copy ) {
echo '<p class="catch">' . esc_html( $catch_copy ) . '</p>';
}
?>
ここで指定するのはフィールドの「ラベル」ではなく「フィールド名」です。ラベルが「キャッチコピー」でも、フィールド名が catch_copy ならコードには catch_copy を書きます。フィールド名はフィールドグループの編集画面で確認できます。
投稿IDとループの位置
get_field() は、第2引数を省略すると「現在の投稿」の値を取ります。ループの外やサイドバー、ヘッダーで使うと、意図しない投稿の値を取って空になることがあります。特定の投稿の値を取る場合は第2引数に投稿IDを渡します。投稿以外に保存した値は、取得するときの指定方法が異なります。
- オプションページの値:
get_field( 'field_name', 'option' ) - カテゴリーやタグの値:
get_field( 'field_name', 'term_' . $term_id )、またはタームのオブジェクトを渡す - ユーザーの値:
get_field( 'field_name', 'user_' . $user_id )
戻り値の形式
画像、ファイル、リンク、関連投稿などのフィールドには「返り値」の設定があり、配列、ID、URLなどを選べます。配列を返す設定のまま echo すると、画面には「Array」と表示されるか何も表示されません。画像を配列で返す場合は、必要な要素を取り出して出力します。
<?php
$image = get_field( 'main_image' );
if ( $image ) {
echo '<img src="' . esc_url( $image['url'] ) . '" alt="' . esc_attr( $image['alt'] ) . '">';
}
?>
リピーターの中のフィールドは、have_rows() と the_row() でループし、get_sub_field() で取得します。get_field() で直接サブフィールドの名前を指定しても値は取れません。
HTMLが消える・警告が出る
ACFの6.2.5以降では、the_field() で出力する値に含まれる安全でないHTMLが自動的に取り除かれるようになり、管理画面に通知が表示される場合があります。以前は表示されていた <script> や <iframe> などが急に消えた場合は、この変更が原因の可能性があります。信頼できる値だけを、get_field() で取得して wp_kses_post() などで許可するタグを決めて出力する形に書き換えます。
テーマ側の前提
ACFを停止した状態でテンプレートが get_field() を呼ぶとエラーで表示が止まるため、function_exists( 'get_field' ) で存在を確認してから呼ぶと安全です。また、ブロックテーマ(フルサイト編集のテーマ)では、テンプレートがHTMLで書かれているため、PHPの get_field() を直接書けません。ブロックテーマで値を表示するには、ブロックバインディングやACFブロックの仕組みを使います。
ページキャッシュを使っている場合は、値を更新しても古い表示が残ることがあるため、確認前にキャッシュを削除します。
まとめ
- 「編集画面に出ない」か「サイトに出ない」かで、見る場所が変わる
- 編集画面の問題は、フィールドグループの有効化、位置ルール、ブロックエディターのパネル設定を順に確認する
- サイト表示の問題は、
get_field()のecho漏れ、フィールド名の指定、投稿IDの指定、返り値の形式を確認する - 値のHTMLが消える場合はACF 6.2.5以降のエスケープの変更を疑い、ブロックテーマではPHP以外の表示方法を使う