入力したのにサイトに出ない——ACF(SCF)でいちばん多いつまずきです。原因は出やすい順にほぼ決まっているので、上から順に確認していけば大半は数分で切り分けられます。
まず切り分け:値が取れていないのか、出力できていないのか
いきなり原因を探すより、どちら側の問題かを先に決めると早いです。表示したい場所に一時的にこれを置きます。
<?php var_dump(get_field('price')); ?>bool(false)やNULLが出た→値が取れていない。1〜5を確認- 値は出ているのに画面に反映されない→出力側の問題。6〜8を確認
- そもそも
var_dumpの結果すら画面に出ない→そのファイルが使われていない。9を確認
1. フィールド名の取り違え(最多)
get_field()に渡すのはラベル(管理画面に見えている日本語)ではなくフィールド名(半角英数)です。「フィールドグループ」の一覧で、ラベルの下に小さく出ている名前を確認します。
- ❌
get_field('価格') - ✅
get_field('price')
アンダースコアとハイフンの違い(event_date / event-date)、末尾のスペースもよくある落とし穴です。
2. ループの中と外を取り違えている
get_field('price')は「今の投稿の値」を取ります。だからループの外(サイドバー・フッター・アーカイブの見出しなど)では、どの投稿か決まらず空になります。第2引数で投稿IDを渡します。
<?php echo esc_html(get_field('price', 123)); ?> <!-- 投稿ID指定 -->
<?php echo esc_html(get_field('price', $post->ID)); ?> <!-- 変数から -->
<?php echo esc_html(get_field('site_tel', 'option')); ?> <!-- オプションページの値 -->タームや固定ページの値なら、get_field('name', 'category_5')やget_field('name', get_option('page_for_posts'))のように対象を明示します。
3. くり返し・グループの中なのにget_fieldを使っている
くり返しフィールドやグループの中は専用の関数です。ここを間違えると、名前が合っていても静かに空になります。
<?php while (have_rows('faq')) : the_row(); ?>
<?php the_sub_field('question'); ?> <!-- ✅ サブ用 -->
<?php the_field('question'); ?> <!-- ❌ 空になる -->
<?php endwhile; ?>グループならget_field('company')['tel']のように箱を開けてから中身です。
4. フィールドグループの「表示条件」が合っていない
フィールドグループにはどこに表示するかのルール(投稿タイプ・テンプレート・タクソノミーなど)があります。ここが対象と合っていないと、入力欄そのものが出ていない=値が保存されていない状態になります。
編集画面にその欄が見えているかを、まず目で確認します。見えていないなら、フィールドグループの「設定」→「場所」(表示条件)を見直します。
5. プラグインが無効・別の環境に入っていない
本番へアップしたら消えた、という場合はこれです。テーマのコードは移したのに、プラグインが有効化されていない——get_field()が存在しないためエラーか空になります。
<?php if (function_exists('get_field')) : ?>
<?php the_field('price'); ?>
<?php endif; ?>function_exists()で囲んでおくと、プラグイン停止時にサイト全体が落ちるのを防げます。配布・納品するテーマでは特に有効な作法です。
6. 配列を出力しようとしている(「Array」と出る)
チェックボックス・リンク・グループ・くり返し、そして返り値を「画像配列」にした画像フィールドは配列です。the_field()ではそのまま出せません。
<?php $link = get_field('button'); ?>
<a href="<?php echo esc_url($link['url']); ?>"><?php echo esc_html($link['title']); ?></a>べんりワザACFフィールド別・表示の書き方早見表どのフィールドが何を返すかは早見表で確認できます7. 「0」や「空文字」の判定でつまずいている
if (get_field('stock'))は、値が0のときも「無い」扱いになります。在庫0や「0円」を表示したいときは、明示的に比較します。
<?php $stock = get_field('stock'); ?>
<?php if ($stock !== '' && $stock !== null) : ?>
<p>在庫:<?php echo esc_html($stock); ?></p>
<?php endif; ?>8. サブループのあと、後始末を忘れている
WP_Queryやthe_post()で別の投稿を回したあと、wp_reset_postdata()を呼び忘れると、そのあとのget_field()が別の投稿を指したままになります。「一覧の下だけ値がおかしい」ときはここを疑います。
<?php $q = new WP_Query(['posts_per_page' => 3]); ?>
<?php while ($q->have_posts()) : $q->the_post(); ?>
<?php the_title(); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?> <!-- ← これ -->べんりワザループの外で投稿を取得する方法(WP_Query)サブループの正しい書き方と後始末はこちら9. そのテンプレートファイルが使われていない
編集しているファイルが、実はそのページの担当ではないパターンです。先頭に目印を置くのが確実な確認方法です。
<?php echo '★single.php'; ?>これが画面に出なければ、テンプレート階層の別のファイル(single-shohin.php・page-about.php・index.phpなど)が使われています。使われているファイルの名前は、テーマの構成とURLの種類から逆算します。
10. キャッシュが残っている
キャッシュ系プラグインやサーバー側のキャッシュ、CDNが古いHTMLを返していることがあります。シークレットウィンドウで開く・キャッシュを削除するで切り分けられます。管理画面では出るのにサイトでは出ない、直したのに変わらない——この2つが典型的なサインです。
まとめ
- 最初に
var_dump(get_field('名前'))で、取れていない側か出せていない側かを切り分ける - 取れていないならフィールド名・投稿IDの指定・サブ用関数・表示条件・プラグインの5点
- 出せていないなら配列・0の判定・
wp_reset_postdata()の3点 - 何も出ないならそのテンプレートが使われていないか、キャッシュを疑う
順番に見ていけば必ずどこかで引っかかります。あてずっぽうに直すより、切り分けから入るのがいちばん速い道です。