WordPressカスタムフィールドとACFの使い方|設定・取得・表示方法

カスタムフィールドを使うと、本文とは別に「価格」「住所」「商品URL」などの値を保存し、同じレイアウトへ表示できます。更新担当者は決められた欄へ入力するだけになり、テーマ側では値を一覧や詳細ページへ再利用できます。

一方、保存しただけでは公開画面に自動表示されません。フィールド設計、入力画面、テンプレートの取得処理、出力時の安全対策をセットで考える必要があります。この記事ではWordPress標準機能とAdvanced Custom Fieldsの両方を使い、設定から表示までをつなげます。

WordPressのカスタムフィールドとは

カスタムフィールドは、投稿や固定ページに任意のメタデータを追加する仕組みです。値は主に投稿メタとして保存され、本文とは別に名前と値の組で管理されます。

たとえば店舗ページなら、住所、電話番号、営業時間、地図URLを別々の欄にできます。物件ページなら価格、間取り、面積を分けられます。項目が決まっているため、本文へ自由入力するより表記をそろえやすく、検索や並び替えの材料にもできます。

表示にはテーマやプラグイン側の実装が必要です。PHPをどこへ書くか分からない場合は「functions.phpでの出力」、テンプレート全体を組み立てる場合は「WordPressテーマの自作」で基礎を確認してください。稼働中の親テーマへ直接書くと更新で消えるため、子テーマまたは専用プラグインを使います。

標準カスタムフィールドとACFの違い

WordPress標準機能でも、キーと値を入力して投稿メタを保存できます。追加プラグインが不要で、取得にはWordPress本体の関数を使えます。ただし、入力欄は汎用的で、日付、画像、選択肢などの入力形式や表示条件を整えるには開発が必要です。

Advanced Custom Fieldsは、一般にACFと呼ばれるプラグインです。テキスト、画像、選択、真偽値などの入力欄を管理画面で作成し、投稿タイプやテンプレートなどの条件に応じて表示できます。

比較点WordPress標準ACF
導入本体のみプラグインを追加
入力画面キーと値が中心項目名、説明、入力形式を設定可能
表示条件原則として開発フィールドグループで設定可能
取得get_post_meta関数get_field関数など
向く用途少数の単純な値、独自実装更新者が入力する定型項目

ACFを止めても投稿メタが直ちに削除されるわけではありませんが、ACFの入力画面と専用関数は使えなくなります。製品へ依存しない移行を想定するなら、フィールド名、保存形式、出力箇所を仕様書に残します。

どちらを使う場合も、本文を細かく分解しすぎないことが大切です。自由な説明文まで一文ずつフィールド化すると、編集画面が長くなり、レイアウト変更にも弱くなります。並び替え、絞り込み、別画面での再利用が必要な値をフィールドへし、記事ごとに構成が変わる説明は本文ブロックへ残します。

ACF無料版とPro版の違い

無料版には、テキスト、テキストエリア、数値、メール、URL、画像、ファイル、選択、チェックボックス、関連投稿など、基本的なフィールドが含まれます。単一の店舗情報や製品仕様を入力する用途なら、無料版で足りる場合が多いでしょう。

Pro版には、繰り返し行を作るRepeater、複数画像を管理するGallery、複数レイアウトを組み替えるFlexible Content、サイト全体の共通値を置くOptions Pages、ACF Blocksなどが含まれます。たとえば、スタッフを人数分追加する、施工写真を複数並べる、といった可変件数のデータに向きます。

有料か無料かは項目数ではなく、データ構造で決めます。固定された10項目なら無料版で構成できても、同じ項目群を必要な数だけ増やすならRepeaterが適します。契約前には現行ライセンス、利用サイト数、更新条件をACF公式ページで確認してください。

ACFをインストールしてフィールドグループを作る

作業前にバックアップを取り、ステージング環境があれば先に試します。

  1. 管理画面の「プラグイン」から新規追加を開く
  2. Advanced Custom Fieldsを検索し、提供元を確認してインストール・有効化する
  3. 「ACF」または「カスタムフィールド」からフィールドグループを新規作成する
  4. グループ名を付け、必要なフィールドを追加する
  5. 各フィールドのラベル、フィールド名、タイプ、必須設定、説明を決める
  6. 表示ルールで「投稿タイプが商品と等しい」などの条件を設定する
  7. 保存し、対象投稿の編集画面で入力欄を確認する

フィールド名はテンプレートから参照する識別子です。公開後に変更すると取得処理との対応が切れるため、半角英数字とアンダースコアを使い、意味が分かる名前にします。画面に見えるラベルは後から変えられます。

必須設定は入力漏れを防ぎますが、既存投稿に値がない状態で必須化すると更新作業を止めることがあります。初期値、空の場合の表示、過去データの移行も決めてから有効にしてください。

開発、検証、本番で同じフィールド定義を使うなら、ACFのLocal JSONやPHPによる登録を検討します。管理画面だけで変更すると環境間で差が生まれるため、誰がどこで定義を変更し、どの方法で反映するかを決めます。JSONファイルにはフィールド構造が含まれるので、信頼できない出所のものをそのまま取り込まないでください。

公開後にフィールド名を変える必要がある場合は、新しい欄を追加し、既存値を移行して、テンプレートを切り替えてから古い欄を廃止します。一度に名称だけ変えると、過去投稿の値が見えなくなったように見えることがあります。

ACFの主なフィールドタイプと選び方

保存後の使い方から逆算すると、フィールドタイプを選びやすくなります。

保存したい内容主なタイプ設計時の注意
商品名、型番テキスト文字数と空欄時の表示
価格、件数数値単位を値に含めるか分けるか
説明文テキストエリア、WYSIWYGHTMLを許可する範囲
公式サイトURL、リンクリンク文字を別管理するか
代表写真画像戻り値をID、配列、URLのどれにするか
種別選択、ラジオ、チェックボックス保存値と表示名を分けるか
公開可否True / False未入力とfalseの扱い
関連記事Post Object、Relationship取得件数と循環参照

画像やリンクは「戻り値の形式」によって取得結果が変わります。コード例と設定が一致しないと表示されません。数値は「1,000円」をそのまま保存するより、1000と単位を分けたほうが計算や並び替えに使いやすくなります。

日付も表示用の「2026年8月11日」ではなく、並び替えと変換に適した保存形式を選びます。選択肢では、保存値をshop、表示名を店舗のように分けておくと、画面の日本語表記を変えても内部値を維持できます。真偽値には「未入力」「false」「0」の違いがあるため、条件分岐で厳密に扱います。

カスタムフィールドをテンプレートへ表示する

入力値を公開画面へ出す処理は、子テーマの対象テンプレート、テンプレートパーツ、または自作プラグインへ置きます。現在の投稿を表示するループ内なら、ACFの取得関数はその投稿を参照します。別投稿の値が必要なら投稿IDを明示します。

値は保存時だけでなく、出力場所に合う方法で直前にエスケープします。通常文字列にはesc_html関数、URLにはesc_url関数、HTML属性にはesc_attr関数を使います。装飾用HTMLを許す文章は、許可するタグを決めてwp_kses_post関数などで処理します。

テキスト値を取得・表示する

次の例は、ACFでフィールド名をproduct_nameにしたテキストを、現在の投稿のテンプレートへ表示します。

<?php
$product_name = get_field( 'product_name' );

if ( $product_name ) :
    ?>
    <p class="product-name"><?php echo esc_html( $product_name ); ?></p>
    <?php
endif;
?>

get_field関数は値を返すため、空かどうかを確認してから出力します。単純な文字列を表示するなら、HTMLを除去するesc_html関数が適しています。ACFの取得関数は利用場所を推測して自動で最適な出力処理をするわけではないため、取得と表示を分けて考えます。

画像やリンクを取得・表示する

画像フィールドの戻り値を「画像ID」、リンクフィールドの戻り値を「リンク配列」にした例です。WordPressの画像関数を使うと、登録された代替テキストやサイズ別画像を利用できます。

<?php
$image_id = get_field( 'product_image' );
$link     = get_field( 'product_link' );

if ( $image_id ) {
    echo wp_get_attachment_image( $image_id, 'large' );
}

if ( $link && ! empty( $link['url'] ) ) :
    $target = ! empty( $link['target'] ) ? $link['target'] : '_self';
    ?>
    <a href="<?php echo esc_url( $link['url'] ); ?>" target="<?php echo esc_attr( $target ); ?>">
        <?php echo esc_html( $link['title'] ?: '詳細を見る' ); ?>
    </a>
    <?php
endif;
?>

新しいタブで開くリンクでは、テーマの方針に応じてnoopener相当のrel属性も検討します。画像のURLだけを直接保存するより、画像IDを使うと、WordPressが生成する画像サイズや添付情報を利用しやすくなります。

WordPress標準機能で追加・取得・表示する

標準のカスタムフィールド欄が見えない場合は、投稿編集画面の設定から「カスタムフィールド」を有効にします。キーと値を追加し、投稿を保存します。同じキーを複数回登録できるため、単一値として使うか複数値として使うかを設計時に決めます。

単一の値を取得する例は次のとおりです。第三引数をtrueにすると、最初の単一値を返します。

<?php
$model_number = get_post_meta( get_the_ID(), 'model_number', true );

if ( $model_number !== '' ) :
    ?>
    <p>型番:<?php echo esc_html( $model_number ); ?></p>
    <?php
endif;
?>

ACFで作った値も投稿メタへ保存されるものがありますが、フィールドタイプによって保存形式や補助データが異なります。ACF管理のデータをすべて標準関数へ置き換える場合は、個々の形式を確認してください。

カスタム投稿タイプと組み合わせる考え方

商品、事例、店舗などを通常のブログ投稿と分けるなら、カスタム投稿タイプを作り、ACFの表示ルールをその投稿タイプへ限定します。「カスタム投稿タイプとの組み合わせ」では、登録とテンプレートの関係を詳しく確認できます。

設計例として、店舗という投稿タイプに住所、電話番号、営業時間を持たせ、single-store.phpで詳細を表示し、archive-store.phpで一覧へ必要な値だけ出す構成があります。全項目を一覧で取得するとデータ量が増えるため、一覧に必要な項目を絞ります。

投稿タイプ、フィールド名、テンプレート名を別々の担当者が決める場合は、対応表を作ります。値の型、必須、初期値、空欄時表示、移行方法まで残しておくと、テーマ交換や改修時に判断しやすくなります。

カスタムフィールドによる絞り込みや並び替えは便利ですが、投稿数と条件が増えるとメタクエリが重くなることがあります。大量データ、複数条件、頻繁な集計が必要なら、キャッシュ、専用テーブル、検索基盤なども含めて設計します。まず実データに近い件数で計測し、推測だけで複雑な最適化を入れないでください。

カスタムフィールドが表示されない・値を取得できない場合

表示されないときは、入力画面と公開画面を分けて確認します。

  1. フィールドグループが公開状態か
  2. 表示ルールが対象の投稿タイプやテンプレートに一致するか
  3. 投稿を更新し、実際に値が保存されているか
  4. コードのフィールド名が設定と完全に一致するか
  5. 画像やリンクの戻り値形式がコードの想定と一致するか
  6. 編集しているテンプレートが実際のページで使われているか
  7. キャッシュを消しても同じか

get_field関数がfalseを返す場合は、ACFが有効か、現在の投稿IDが正しいかも確認します。ループ外、オプションページ、ユーザー、タームなど、投稿以外の値は参照先IDの指定方法が異なります。

PHPエラーで画面が白くなる場合は、本番でエラーを表示し続けず、ログへ記録して該当行を確認します。関数が存在するかを確認する防御や、プラグイン停止時の代替表示も必要に応じて実装します。

値が管理画面では見えるのに公開側だけ古い場合は、ページキャッシュ、オブジェクトキャッシュ、CDNを順に確認します。多言語プラグインや複製機能を使うサイトでは、フィールドが翻訳対象か、元投稿からコピーされるかも設定によって異なります。

セキュリティと運用上の注意

管理画面へ入力できる人を信頼していても、出力時のエスケープは省略しません。URL、文字列、HTML属性、許可するHTMLでは使う関数が異なります。保存時のサニタイズと、表示時のエスケープは目的が違います。

ACF、WordPress本体、テーマは更新し、ACF JSONを外部から取り込む場合は配布元と内容を確認します。フィールドを削除する前には、どのテンプレート、一覧、APIが参照しているかを検索し、データの保持期間を決めます。

入力者の権限も確認します。フィールドグループを設計できる人と、値だけを編集する人を分け、説明文や入力制限で誤入力を防ぎます。公開画面で使わない内部メモがREST APIや検索機能から取得できないか、show_in_restなど関連設定も調べます。

機密情報はカスタムフィールドへ置かないでください。非公開投稿のメタデータでも、テーマ、REST API設定、プラグインの実装次第で露出する可能性があります。APIキーやパスワードは、アクセス制御された環境設定など、用途に合う保管方法を選びます。

よくある質問

Q
ACFを削除すると入力したデータも消えますか?
A

プラグインを無効化または削除しても、通常は保存済み投稿メタが直ちに消えるわけではありません。ただし入力画面とACF関数は使えなくなり、フィールドタイプによって補助データもあります。削除前にバックアップと移行テストを行ってください。

Q
カスタムフィールドはSEOに影響しますか?
A

保存しただけでは検索エンジンに内容が伝わりません。公開テンプレートへ有用な情報として表示され、ページ全体が適切にクロールできる場合に、その内容がページの一部になります。重複した定型文や空欄を大量表示するのは避けます。

Q
ブロックだけで代用できますか?
A

編集者が自由にレイアウトする内容なら、コアブロックやパターンで足りることがあります。値を一覧で抽出する、形式をそろえる、外部連携する場合はカスタムフィールドが適しています。将来の再利用方法で選びます。

まとめ

WordPressのカスタムフィールドは、定型データを本文と分けて保存し、テーマ側で再利用する仕組みです。少数の単純な値は標準機能、入力形式や表示条件を整えたい場合はACFが使いやすい選択になります。

フィールド名と戻り値形式を決め、対象テンプレートで値を取得し、出力場所に合う関数でエスケープしてください。空欄時の表示、プラグイン停止時の動作、将来の移行まで設計しておくと、長期運用しやすくなります。

この記事を書いた人

Hara Daizo

Hara Daizo

Web制作会社、Web担当者を経て独立。17年以上の実務経験で培った制作スキルとSEOノウハウを活かし、現在はSTARRY代表としてWordPressサイト制作・集客サポートを提供。大手クラウドソーシングのWebデザイナーランキング上位受賞多数。