Advanced Custom Fields(ACF)は、WordPressで独自の入力項目(カスタムフィールド)を簡単に追加できるプラグインです。
Advanced Custom Fields(ACF)を使う際、
「get_fieldとthe_fieldの違いがわからない」
「リピーターフィールドの書き方が難しい」
と感じることはありませんか?
本記事では、ACFでよく使うPHP関数を一覧で整理し、
実際のコード例付きでわかりやすく解説します。
1.ACFで頻出のPHP関数 5選
| 関数 | 処理内容 |
|---|---|
| the_field() | カスタムフィールドの出力 |
| get_field() | カスタムフィールドの値を取得(出力はechoが必要) |
| the_sub_field() | サブフィールドの出力 |
| get_sub_field() | サブフィールドの取得(出力はechoが必要) |
| have_rows()、the_row() | リピートのフィールド |
2.ACF関数の使い方とコード例
the_field()の使い方
フィールドを表示させる際に使用します。
その場で echo する
返り値は使わない
HTMLに直接表示する用途向きです。
具体例
フィールドタイプ:テキスト
フィールドラベル:会社名
フィールド名:company_name

固定ページの編集画面にて情報の記述をします。

PHPに記述を行います。
<p>会社名:<?php the_field('company_name'); ?></p>
出力結果

get_field()の使い方
フィールドを表示させる際に使用します。
値を返す(return)
変数に代入できる
if文・加工・属性指定に使えます。
具体例
フィールドタイプ:画像フィールド(画像配列の場合はget_fieldが必要)
フィールドラベル:画像
フィールド名:main_image
戻り値の形式:画像配列

固定ページの編集画面にて情報の記述をします。

PHPに記述を行います。
<?php
$img = get_field('main_image');
if ( $img ) : ?>
<img src="<?php echo esc_url($img['url']); ?>" alt="<?php echo esc_attr($img['alt']); ?>">
<?php endif; ?>
出力結果

the_fieldとget_fieldの違い
the_field:そのまま出力できる
get_field:echoを使って表示する
the_sub_field / get_sub_field
the_sub_field:リピーターフィールドthe_row()の中でのみ使用します。今の行の値を表示する役割。the_field() の「リピーター版」というような考え方でOKです。
get_sub_field:リピーターフィールドthe_row()の中でのみ使用します。今の行の値を取得する役割。get_field() の「リピーター版」というような考え方でOKです。
have_rows / the_row(リピーター)
繰り返しのフィールドで用います。
have_rows:繰り返しフィールド(リピーター/柔軟コンテンツ)に「まだ行が残っているか」を確認する
the_row:「現在の行のデータをセットして、ポインタを一つ進める」という役割
この2つは 必ずセットで使うものです。
具体例
ACFのフィールド構成
リピーターフィールド:staff
名前:name
役職:position
| リピーターフィールド:staff | 名前:name | 役職:position |
|---|---|---|
| 1行目 | 田中 | 店長 |
| 2行目 | 佐藤 | スタッフ |
| 3行目 | 鈴木 | スタッフ |
PHPの記述
<?php if ( have_rows('staff') ) : ?>
<ul>
<?php while ( have_rows('staff') ) : the_row(); ?>
<li>
<strong><?php the_sub_field('name'); ?></strong><br>
<?php the_sub_field('position'); ?>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
処理のイメージ
have_rows('staff')→ 行があるか確認(true)the_row()→ 1行目に移動the_sub_field('name')→ その行の名前を出力the_sub_field('position')→ その行の役職を出力- while に戻る → 再び
have_rows()で次の行があるか確認
出力結果
・田中
店長
・佐藤
スタッフ
・鈴木
スタッフ
3.値が表示されないときのチェックリスト
原因1:フィールド名(スラッグ)のスペルミス
ACFの「フィールド名」とPHP側の記述が一致しているか確認します。
<?php the_field('company_name'); ?>
ACF側のフィールド名が company_name 以外になっていると表示されません。
特に注意したいポイント
- フィールドラベルではなく「フィールド名」を使う
- 大文字・小文字
_の有無
原因2:投稿・固定ページの値が未入力
ACFの項目を作成していても、投稿や固定ページ側に値が入っていない場合は表示されません。
特に以下を確認します。
- 入力後に更新ボタンを押したか
- 対象ページに入力しているか
- 別の投稿を編集していないか
原因3:フィールドグループの表示条件の不一致
ACFでは「この画面で表示する」という条件設定があります。
例えば、
- 固定ページのみ
- 特定テンプレートのみ
- 投稿タイプのみ
などの条件になっていると、対象外ページでは値を取得できない場合があります。
原因4:ループ外で the_sub_field() を使っている場合
the_sub_field() や get_sub_field() は、have_rows() と the_row() の中でのみ使用できます。
誤った例:
<?php the_sub_field('name'); ?>
正しい例:
<?php if ( have_rows('staff') ) : ?>
<?php while ( have_rows('staff') ) : the_row(); ?>
<?php the_sub_field('name'); ?>
<?php endwhile; ?>
<?php endif; ?>
原因5:have_rows() の条件に入れていない
リピーターフィールドでは、have_rows() が false の場合、ループ処理は実行されません。
例:
<?php if ( have_rows('staff') ) : ?>
リピーターフィールド側に行データが入っているか確認します。
原因6:get_field() の戻り値形式の不一致
画像フィールドやリンクフィールドでは、戻り値形式によって取得できる値が変わります。
例えば画像フィールドでは、
- 画像ID
- 画像URL
- 画像配列
を選択できます。
画像配列を想定しているのに、URL形式になっていると以下は動作しません。
<img src="<?php echo esc_url($img['url']); ?>">
これは非常に多いミスなので、ACF側の「戻り値の形式」をしっかり確認しましょう。
原因7:echo を忘れている
get_field() は値を取得する関数のため、そのままでは画面に表示されません。
誤った例:
<?php get_field('company_name'); ?>
正しい例:
<?php echo get_field('company_name'); ?>
また、単純に表示したいだけなら the_field() を使用すると簡単です。
<?php the_field('company_name'); ?>
4.ACF関数の使い分けまとめ
ACFで使用するPHP関数は、役割ごとに大きく分けることができます。
- 出力系(the_field / the_sub_field)
→ 値をそのまま画面に出力したいときに使用する - 取得系(get_field / get_sub_field)
→ 値を取得して、条件分岐や加工を行いたいときに使用する - 繰り返し系(have_rows / the_row)
→ リピーターフィールドや柔軟コンテンツを繰り返し処理するために使用する
まずは 表示したいだけなら the_ 系、
処理をしたいなら get_ 系 と覚えておくと、ACFの実装がスムーズになります。
ACFの基本設定や作成方法についてはこちらの記事で紹介しています。
無料版でリピートフィールドを代替する方法について紹介した記事はこちらで紹介しています。