2026年8月5日

2026年8月5日

WordPress Advanced Custom Fields(ACF)の使い方|フィールド作成からテンプレートでの表示まで

Advanced Custom Fields(ACF)は、投稿や固定ページに「価格」「所在地」「メイン画像」のような独自の入力欄を追加し、その値をテーマで表示するためのプラグインです。この記事では、フィールドグループの作り方、get_field() での取り出しとエスケープ、画像やリピーターの扱い、無料版とACF PROの違い、運用時の注意点までを順に解説します。テンプレートに数行のコードを書ける方なら、読み終えた時点で独自項目を持つページを作れるようになります。

ACFでできることと、無料版・PROの違い

WordPressには標準で「カスタムフィールド」(投稿メタ)の仕組みがありますが、管理画面での入力欄は簡素で、入力形式も文字列だけです。ACFを使うと、テキスト・数値・画像・日付・選択肢・リンク・投稿の関連付けなどの入力欄を、画面上の操作で追加できます。保存先は通常の投稿メタ(wp_postmeta)なので、仕組みとしてはWordPress標準の延長です。

ACFには無料版と有料のACF PROがあります。代表的な違いは次のとおりです(機能の区分は変更されることがあるため、導入前に公式サイトで確認してください。2026年10月現在の一般的な区分です)。

  • 無料版で使える主な機能:テキスト・テキストエリア・数値・メール・URL・画像・ファイル・WYSIWYG・選択・チェックボックス・真偽値・日付・リンク・投稿オブジェクト・関連・タクソノミーなどの基本フィールド、グループフィールド、カスタム投稿タイプとタクソノミーの登録画面
  • ACF PROで追加される主な機能:リピーター、柔軟コンテンツ(Flexible Content)、ギャラリー、クローン、オプションページ、ACFブロック

「行を好きなだけ追加できる入力欄」はリピーター、「ブロックのようにレイアウトを選んで並べる入力欄」は柔軟コンテンツで、どちらもPRO専用です。必要な機能がどちらに入っているかを先に確認しておくと、作ってから作り直す手間を避けられます。

配布元についての補足

2024年10月以降、WordPress.org のプラグインディレクトリでは、従来のACFの掲載枠が「Secure Custom Fields」というフォーク版に置き換えられました。開発元のWP Engineは、ACFを公式サイト(advancedcustomfields.com)経由で引き続き配布しています。両者は現時点で関数名がほぼ共通ですが、今後の方針は変わる可能性があります。どちらを使っているかを管理画面のプラグイン一覧で確認し、更新の入手元を把握しておいてください。

フィールドグループを作る

ACFでは、複数のフィールドを「フィールドグループ」としてまとめ、どの画面に表示するかを「位置(ロケーション)ルール」で指定します。メニュー名や項目名はバージョンによって多少変わりますが、手順の流れは次のとおりです。

  1. 管理画面のACFのメニューからフィールドグループを新規追加する
  2. グループ名(例:物件情報)を付け、フィールドを追加する
  3. 各フィールドに「ラベル」(画面に出る名前)と「名前」(コードで使うキー、例:price)を設定する
  4. 位置ルールで「投稿タイプが物件と等しい」のように表示先を指定する
  5. 保存し、対象の投稿編集画面に入力欄が出ているかを確認する

つまずきやすいのは「名前」です。コードからはラベルではなく名前で値を取り出すため、英数字とアンダースコアで、後から変えずに済む名前を付けます。途中で名前を変えると、すでに保存されている値は古いキーのまま残り、テンプレートからは空に見えます。

フィールドグループの定義は通常データベースに保存されますが、テーマ内に acf-json フォルダを作っておくと、保存時に定義がJSONファイルとしても書き出されます(ローカルJSON)。Gitで管理でき、ステージングと本番で定義をそろえやすくなるので、チームで開発する場合はおすすめです。

テンプレートで値を表示する

値の取り出しには get_field() を使います。第1引数がフィールド名、第2引数を省略すると現在の投稿が対象です。表示するときはフィールドの種類に合ったエスケープを行います。

<?php
$price   = get_field( 'price' );
$address = get_field( 'address' );
$url     = get_field( 'official_url' );

if ( $price ) : ?>
	<p class="price">価格:<?php echo esc_html( number_format( (int) $price ) ); ?>円</p>
<?php endif; ?>

<?php if ( $address ) : ?>
	<p class="address"><?php echo esc_html( $address ); ?></p>
<?php endif; ?>

<?php if ( $url ) : ?>
	<a href="<?php echo esc_url( $url ); ?>">公式サイト</a>
<?php endif; ?>

the_field() は値をそのまま出力する関数ですが、近年のバージョンでは安全のため出力時のエスケープ処理が強化され、HTMLを含む値の表示が変わるケースがあります。どの値をどうエスケープするかを自分で管理できるよう、get_field() で取得して esc_html()・esc_url()・esc_attr()・wp_kses_post() を使い分ける書き方をおすすめします。WYSIWYGフィールドのようにHTMLを含む値は wp_kses_post() を使います。

投稿以外に保存した値を取り出す

第2引数で取得元を指定できます。

  • 別の投稿:get_field( 'price', 123 )
  • タームの値:get_field( 'color', 'term_' . $term_id ) またはタームオブジェクトを渡す
  • ユーザーの値:get_field( 'department', 'user_' . $user_id )
  • オプションページ(PRO):get_field( 'company_tel', 'option' )

画像フィールドは「返り値」を確認する

画像フィールドには「返り値の形式」の設定があり、配列・URL・IDから選べます。ここを確認せずにコードを書くと、「Array」と表示されたり画像が出なかったりします。おすすめはIDを返す設定にして wp_get_attachment_image() で出力する方法です。srcset や width/height 属性、遅延読み込みがWordPress側で付くため、レイアウトのずれ(CLS)も防ぎやすくなります。

<?php
$image_id = get_field( 'main_image' ); // 返り値の形式:ID
if ( $image_id ) {
	echo wp_get_attachment_image( $image_id, 'large', false, array( 'class' => 'main-image' ) );
}

リピーターと柔軟コンテンツ(ACF PRO)

リピーターは have_rows() と the_row() でループし、行の中の値は get_sub_field() で取り出します。

<?php if ( have_rows( 'faq' ) ) : ?>
	<dl class="faq">
	<?php while ( have_rows( 'faq' ) ) : the_row(); ?>
		<dt><?php echo esc_html( get_sub_field( 'question' ) ); ?></dt>
		<dd><?php echo wp_kses_post( get_sub_field( 'answer' ) ); ?></dd>
	<?php endwhile; ?>
	</dl>
<?php endif; ?>

柔軟コンテンツも同じく have_rows() でループし、get_row_layout() で現在の行のレイアウト名を判定して出し分けます。レイアウトごとに get_template_part() で部品ファイルを分けると、テンプレートが長くなりすぎません。

運用で気をつけること

ACFを停止するとサイトが止まる書き方を避ける

テンプレートで get_field() を直接呼んでいると、ACFを停止したり更新に失敗したりしたときに「未定義の関数」エラーでページが表示されなくなります。重要なテンプレートでは、次のように存在確認をしておくと安全です。

<?php
$price = function_exists( 'get_field' ) ? get_field( 'price' ) : get_post_meta( get_the_ID(), 'price', true );

表示が空になるときの確認順

  1. フィールドの「名前」とコードのキーが一致しているか(ラベルと取り違えていないか)
  2. 位置ルールが正しく、その投稿で実際に値が保存されているか
  3. ループの外で呼んでいないか(ループ外では第2引数に投稿IDを渡す)
  4. 返り値の形式(配列・URL・ID)とコードの扱いが合っているか
  5. ステージングと本番でフィールドグループの定義がずれていないか(ローカルJSONで同期する)

更新・移行の前にバックアップ

ACFのメジャーアップデートや、ACFと Secure Custom Fields の切り替えなどを行う前には、データベースとファイルのバックアップを取り、ステージング環境で表示を確認してから本番に反映してください。値自体は投稿メタに残るため、プラグインを切り替えても通常はデータが消えることはありませんが、PRO専用フィールドの表示や管理画面の挙動は確認が必要です。

まとめ

  • ACFは投稿メタを使って独自の入力欄を追加するプラグインで、フィールドグループと位置ルールで表示先を決める
  • リピーター・柔軟コンテンツ・ギャラリー・オプションページはACF PROの機能。必要な機能がどちらにあるかを先に確認する
  • 値は get_field() で取り出し、esc_html()・esc_url()・wp_kses_post() などでエスケープして出力する
  • 画像はIDで受け取り wp_get_attachment_image() で出すと、srcsetやサイズ属性が自動で付く
  • リピーターは have_rows()・the_row()・get_sub_field()、柔軟コンテンツは get_row_layout() で出し分ける
  • function_exists() での存在確認、ローカルJSONでの定義管理、更新前のバックアップで運用トラブルを減らせる

お気軽にご相談ください

お見積りへ お問い合わせへ
▲