WordPressカスタムフィールドを徹底解説!初心者でもわかる「もう一歩進んだ情報追加術」


カスタムフィールドとは、WordPressの投稿や固定ページに、タイトルと本文以外の情報を「キー(名前)と値」の組で保存できる標準機能です。価格・開催日・評価点数のように、記事ごとに形式が決まっているデータを、本文とは別枠で管理するために使います。

ただし、値を保存しただけではフロントには何も出ません。表示するには、テンプレートに get_post_meta() を書くか、ブロックバインディングでブロックの属性に結びつけるかのどちらかが必要です。そしてどちらの方法を選んでも、うまくいったかどうかの判定は1つだけです。管理画面で値を入力すると表示され、値を空にして更新すると表示も消える。この記事は、その状態に到達するまでを最短で通すために構成しています。

テーマ開発全体のどこに位置する作業かは、WordPressテーマ開発ガイド段階3(機能カスタマイズ)にあたります。段階3の判定(値を空にすると表示も消える)に落ちてこのページに来た方は、そのまま読み進めてください。最後の検証セクションで、消えない原因の切り分けまで扱います。


カスタムフィールドとは|キーと値で「決まった形の情報」を持たせる

WordPressの投稿は、標準では「タイトル」と「本文」の2つしか構造を持ちません。しかし実際のサイトでは、本文に混ぜたくない情報が出てきます。

  • 映画のレビュー記事なら、「監督名」や「公開日」
  • イベント情報なら、「開催日時」や「会場」
  • お店の紹介なら、「営業時間」や「定休日」

これらを本文に書いても画面には出せます。しかしそれは「HTMLの塊の中の文字」でしかなく、あとから取り出すことができません。カスタムフィールドに入れておけば、値はキー(名前)で名指しして取り出せる独立したデータになります。だから「公開日が新しい順に並べる」「営業中の店だけ絞り込む」「テンプレートの決まった位置に必ず出す」といった処理が書けるようになります。

用語は2つだけ覚えれば足ります。キーはデータの名前(例: director_name)、は中身(例: 「スピルバーグ」)です。データベース上は wp_postmeta テーブルに、投稿IDとセットで保存されます。


標準機能で入力欄を出す|ブロックエディタでの手順

カスタムフィールドはプラグインを入れなくても使えます。ただし初期状態では入力欄が隠れているため、まず表示する設定が必要です。

ブロックエディタでの表示手順

  1. 投稿の編集画面を開きます。
  2. 画面右上の⋮(オプション)をクリックします。
  3. メニューから「設定」(Preferences)を開きます。
  4. その中にある「カスタムフィールド」をONにし、表示される「有効化して再読み込み」を押します。
  5. 編集画面が再読み込みされ、本文の下に「カスタムフィールド」の入力欄が現れます。

「設定」の中がさらにタブや小見出しで区切られている場合がありますが、その名前はWordPressのバージョンによって変わります。「設定の中にある『カスタムフィールド』のスイッチを探してONにする」と覚えておけば、画面の細部が違っても迷いません。なおクラシックエディタを使っている場合は、画面右上の「表示オプション」から「カスタムフィールド」にチェックを入れます。よく見かける「表示オプション」の手順はこちらで、ブロックエディタには「表示オプション」自体がありません。

キーの付け方で先に知っておくこと

入力欄には「名前(キー)」と「値」を入れて「カスタムフィールドを追加」を押します。このとき、キーの付け方に2つ落とし穴があります。

  • アンダースコアで始めない。WordPressはキーの先頭が _ のものを「保護されたメタ」として扱い、カスタムフィールドの一覧に表示しません。プラグインが内部で使う値を隠すための仕組みで、自分で入力する値には使わないのが無難です(出典: is_protected_meta() – WordPress Developer Resources)。
  • プルダウンに出てこなくても慌てない。既存キーを選ぶプルダウンに並ぶのは既定で先頭30件までです(postmeta_form_limit フィルターの初期値が30)。並んでいなくても「新規追加」でキー名を手入力すれば同じキーに保存されます(出典: postmeta_form_limit – WordPress Developer Resources)。

テンプレートに値を出す|get_post_meta() の使い方

保存した値をフロントに出す、もっとも基本的な方法がテンプレートへの記述です。投稿の詳細ページを作る single.php や、記事本体を描画する content.php のような、ループの中で動くファイルに書きます。ファイルの役割が曖昧な場合はsingle.phpの書き方WordPressループの基本を先に確認してください。

<?php
// 今見ている投稿のID(番号)を取得する
$post_id = get_the_ID();

// 'my_custom_field' というキーの値を取り出す
// 第3引数の true は「値そのものを1件返す」という指定。
// 「値が1つのときだけ」ではなく、複数保存されていても常に先頭の1件が返る。
// false(既定値)にすると、値が1件でも配列で返ってくる
$my_field_value = get_post_meta( $post_id, 'my_custom_field', true );

// 値が入っているときだけ出力する
// empty() ではなく '' との比較にしているのは、値が "0" のときも表示したいため
if ( '' !== $my_field_value ) {
    echo '<p>カスタムフィールドの値: ' . esc_html( $my_field_value ) . '</p>';
}

第3引数 $single は、返ってくる形を切り替えるスイッチです。ここを取り違えると「値は保存されているのに表示できない」状態になるので、返り値を表で押さえておきます。

$single値があるとき値が無いとき使いどころ
true値そのもの(複数保存されていても先頭1件)空文字 ''1つの値をそのまま表示する
false(既定)値の配列空配列 array()同じキーに複数の値を入れている

もう1つ、あとで必ず効いてくる仕様があります。カスタムフィールドの値は、数値を入れても「文字列」で返ってきます。公式リファレンスにも「numbers (both integer and float) are returned as strings」と明記されています(出典: get_post_meta() – WordPress Developer Resources)。ループの回数や計算にそのまま使うと事故になるため、後述の「おすすめ度」の例で対処法を扱います。


PHPを書かずに出す道|ブロックバインディング

「表示するにはテーマファイルを編集するしかない」という説明をよく見かけますが、これはWordPress 6.5より前の話です。6.5で追加されたブロックバインディングAPIを使うと、カスタムフィールドの値をブロックの属性に直接結びつけられます。テンプレートPHPを触らず、ブロックエディタの中だけで表示まで到達できます。

公式ハンドブックによると、この機能は6.5で導入され(core/post-meta ソースは当初から利用可能)、6.7でエディタ側からのソース登録が加わり、6.9で core/post-datacore/term-data が追加されています(出典: Bindings – Block Editor Handbook)。

使うための条件は2つ

どのキーでも自由に結びつけられるわけではありません。公式ハンドブックが挙げている条件は次の2つです。

  • そのメタキーが show_in_rest => true で登録されていること
  • キー名がアンダースコアで始まっていないこと(保護されたメタは参照できない)

登録は register_meta() で行います。書く場所は、テーマの functions.php か自作プラグインです(functions.phpカスタマイズの基本)。

<?php
// メタキーをブロックエディタから参照できる形で登録する
add_action( 'init', function () {
    register_meta(
        'post',
        'my_custom_field',
        array(
            // show_in_rest が true でないとブロックバインディングから参照できない
            'show_in_rest' => true,
            'single'       => true,
            'type'         => 'string',
        )
    );
} );

登録すると、ブロック側は次のような形でキーを指し示せるようになります。段落の中身がカスタムフィールドの値に置き換わり、値が無いときだけ元のテキストが残ります。

<!-- wp:paragraph {"metadata":{"bindings":{"content":{"source":"core/post-meta","args":{"key":"my_custom_field"}}}}} -->
<p>値が無いときに表示されるテキスト</p>
<!-- /wp:paragraph -->

結びつけられるブロックと属性

対応しているのは、現時点では次の組み合わせだけです。ここに無いブロックへ出したい場合は、これまでどおりテンプレートPHPを書くことになります。

ブロック結びつけられる属性
core/imageid, url, title, alt, caption
core/headingcontent
core/paragraphcontent
core/buttonurl, text, linkTarget, rel
core/navigation-linkurl
core/navigation-submenuurl
core/post-datedatetime

つまり「見出し・段落・画像・ボタンに1つの値を出したいだけ」なら、PHPを書かずに終わります。逆に、複数の値を組み合わせたり、条件によって出し分けたり、独自のHTML構造で囲みたい場合は、次章以降のテンプレート実装が必要です。どちらを選んでも、合否の判定は「値を空にすると表示も消えるか」で共通です。


ACFで入力欄を作る|無料版とPROの境界を先に確認する

標準のカスタムフィールドは、入力欄がただのテキストボックス1種類しかありません。日付を「2025/1/1」と書く人と「2025-01-01」と書く人が混ざるだけで、表示側のコードが破綻します。この問題を解決するのがACF(Advanced Custom Fields)で、日付ピッカー・画像選択・チェックボックスなど、入力の形をあらかじめ決められます。

インストールの前に知っておく1点

管理画面の「プラグイン」→「新規追加」で「Advanced Custom Fields」を検索すると、作者が WP Engine の本家プラグインが上位に出ます。これを「今すぐインストール」→「有効化」すれば、左メニューに「ACF」が追加されます。

ただし、同じ検索結果に Secure Custom Fields(SCF)という、作者が WordPress.org のプラグインも並びます。こちらはACFから派生したもので、SCFの説明文には「有効化すると、機能が重複するプラグイン(Advanced Custom Fields および ACF PRO)を停止する」と明記されています。どちらか片方だけを入れてください(Secure Custom Fields – WordPress.orgAdvanced Custom Fields – WordPress.org)。

無料版で使える機能とPRO限定の機能

初心者がもっとも詰まるのがここです。解説記事でよく登場する「リピーターフィールド」は、ACF無料版のフィールドタイプ一覧には出てきません。ACF公式が「PRO Feature」として挙げているのは次の機能です(出典: ACF PRO – Advanced Custom Fields)。

機能できることACF無料版
リピーター同じ組のフィールドを行として何度でも追加する使えない(PRO)
フレキシブルコンテンツ用意したレイアウトを選んで積み上げる使えない(PRO)
ギャラリー複数画像をまとめて管理・並べ替えする使えない(PRO)
オプションページ投稿に属さないサイト共通の値を持つ使えない(PRO)
クローン既存フィールドを他のグループで再利用する使えない(PRO)
ACFブロックPHPで独自のブロックを作る使えない(PRO)
テキスト・数値・日付・画像・URL等基本のフィールドタイプ使える

費用をかけずにリピーターやオプションページを使いたい場合は、先ほどのSecure Custom Fieldsが選択肢になります。SCFはこれらを含んだ状態で無料配布されています。ただし前述のとおりACFとは共存できないため、プロジェクトの最初にどちらを使うか決めてしまうのが安全です。

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

入力欄は「フィールドグループ」という単位で作ります。

  1. 「ACF」→「フィールドグループ」→「新規追加」を開きます。
  2. グループ名に「映画情報」「イベント詳細」など、用途が分かる名前を付けます。
  3. 「+ フィールドを追加」で、フィールドラベル(管理画面に出る見出し)とフィールド名(コードから呼ぶ名前。例: director_name)、フィールドタイプ(テキスト/数値/日付ピッカー/画像など)を設定します。
  4. 「場所」の設定で、どの投稿タイプにこのグループを出すかを決めます。
  5. 「公開」を押すと、対象の編集画面に入力欄が現れます。

ここでフィールドタイプごとの「Return Format(返り値の形式)」も必ず確認してください。日付や画像は、この設定によってコードに返ってくる値の型が変わります。設定を見ずにサンプルコードを貼ると、次章の失敗をそのまま踏みます。


ACFの値をテンプレートに出す|3つの実践コード例

ACFには専用の取得関数が用意されています。まず、よく混同される2つの違いを整理します。

関数動き向いている場面
the_field('名前')値をその場に出力するそのまま1行出すだけのとき
get_field('名前')値を返す(出力しない)条件分岐・書式変換・計算をはさむとき

例1|おすすめ度を★の数で表示する

ACF側では、フィールドタイプ「数値」で recommendation_level を作ります。表示側は、次のように書きます。

<?php
$recommendation = get_field( 'recommendation_level' );

// カスタムフィールドの値は数値でも「文字列」で返る。
// PHP 8 では int と非数値文字列の比較が文字列比較に切り替わるため、
// 数値以外が入っていると $i < $recommendation がいつまでも真になり、ループが止まらない。
// absint() で整数へ変換してから使う(数値として読めない値は 0 になる)
$stars = absint( $recommendation );

if ( $stars > 0 ) {
    echo '<p>おすすめ度: ' . esc_html( str_repeat( '★', min( $stars, 5 ) ) ) . '</p>';
}

ここは、ネット上のサンプルコードで実害が出やすい箇所です。よく見かける for ( $i = 0; $i < $recommendation; $i++ ) という書き方は、フィールドに数値が入っている限り動きますが、「数値」フィールドは空欄も全角文字も受け付けます。そして前述のとおり値は文字列で返るため、PHP 8では int と非数値文字列の比較が文字列としての比較に落ちます。結果として条件が永久に真になり、ページを開いた読者のブラウザが固まりますabsint() を通して整数にしてから使えば、数値として読めない値は0になり、ループ自体が始まりません。

もう1つ、esc_html() をループの条件式に使わないでください。esc_html()出力の直前に文字列を安全化する関数で、比較や計算のための変換関数ではありません。上のコードのように、最後に画面へ出す値だけを包むのが正しい使い方です。

例2|イベントの開催日時と会場を表示する

ACF側では event_date(日付ピッカー)と event_location(テキスト)を作ります。日付は、ここでも設定の確認が先です。

ACF公式の日付ピッカーの解説には、「値は常に Ymd(YYYYMMDD)でデータベースに保存される」「取得時に返るのは Return Format 設定に従った日付文字列」と書かれています(出典: Date Picker – Advanced Custom Fields)。つまりコードに届く書式は、あなたのフィールド設定次第で変わります。フィールドの設定画面で今の Return Format を必ず確認してください。

<?php
// 日付ピッカーの値は、フィールド設定の「Return Format」どおりの文字列で返る
$event_date     = get_field( 'event_date' );
$event_location = get_field( 'event_location' );

if ( $event_date && $event_location ) {
    echo '<div class="event-info">';

    // Return Format を DB の保存形式と同じ 'Ymd' に合わせておき、同じ書式で読み解く。
    // strtotime() に任せると 01/02/2025 のような書式で月と日が入れ替わる
    $date = DateTime::createFromFormat( 'Ymd', $event_date );

    if ( $date instanceof DateTime ) {
        // wp_date() はサイトのタイムゾーンと言語設定を反映する(date() は反映しない)
        echo '<p>開催日時: ' . esc_html( wp_date( 'Y年n月j日', $date->getTimestamp() ) ) . '</p>';
    } else {
        echo '<p>開催日時: 日付の形式を確認してください</p>';
    }

    echo '<p>場所: ' . esc_html( $event_location ) . '</p>';
    echo '</div>';
}

ここで strtotime() を避けているのには理由があります。strtotime() はスラッシュ区切りの日付を米国式の m/d/Y として解釈します。Return Format が d/m/Y 系だと、2月1日のつもりで入れた 01/02/2025 が1月2日として表示されます。エラーは一切出ず、日付だけが静かに入れ替わるため気づきにくい種類の不具合です。書式が分かっているなら DateTime::createFromFormat() で明示的に読み解くほうが安全で、これはACF公式の解説でも採られている方法です。

表示に date() ではなく wp_date() を使っているのも同じ理由です。date() はPHP側のタイムゾーンで動くため、WordPressの「設定 > 一般」で選んだタイムゾーンや日本語の曜日表記が反映されません(出典: wp_date() – WordPress Developer Resources)。

例3|プロフィールにSNSリンクを並べる

フィールドタイプ「URL」で x_urlfacebook_url を作った場合の例です。

<?php
$x_url        = get_field( 'x_url' );
$facebook_url = get_field( 'facebook_url' );
?>

<ul class="sns-links">
    <?php if ( $x_url ) : ?>
        <li>
            <a href="<?php echo esc_url( $x_url ); ?>" target="_blank" rel="noopener noreferrer">X(旧Twitter)</a>
        </li>
    <?php endif; ?>
    <?php if ( $facebook_url ) : ?>
        <li>
            <a href="<?php echo esc_url( $facebook_url ); ?>" target="_blank" rel="noopener noreferrer">Facebook</a>
        </li>
    <?php endif; ?>
</ul>

外部サイトを別タブで開く target="_blank" には、rel="noopener noreferrer" を必ず添えてください。これが無いと、開いた先のページから元のタブを操作できてしまいます。URLの出力に使う esc_url() も忘れずに。入力値がそのままリンク先になる箇所は、サイト内でもっとも危険な場所の1つです。


リピーターとカスタム投稿タイプ|組み合わせて真価が出る

1つの投稿に「同じ組の情報」を何行も持たせたいとき(ギャラリー、スタッフ一覧、料金表など)に使うのがリピーターフィールドです。前述のとおりACF無料版では選べません。ACF PROかSecure Custom Fieldsを使っている前提で読んでください。

<?php if ( have_rows( 'image_gallery' ) ) : ?>
    <div class="gallery">
        <?php while ( have_rows( 'image_gallery' ) ) : the_row(); ?>
            <?php
            // 画像フィールドの Return Format が「画像配列」のときだけ $image['url'] で取り出せる。
            // 「画像URL」なら文字列、「画像ID」なら整数が返るため、配列アクセスは成立しない
            $image   = get_sub_field( 'gallery_image' );
            $caption = get_sub_field( 'image_caption' );
            ?>
            <figure>
                <?php if ( is_array( $image ) ) : ?>
                    <img src="<?php echo esc_url( $image['url'] ); ?>" alt="<?php echo esc_attr( $image['alt'] ); ?>">
                <?php endif; ?>
                <?php if ( $caption ) : ?>
                    <figcaption><?php echo esc_html( $caption ); ?></figcaption>
                <?php endif; ?>
            </figure>
        <?php endwhile; ?>
    </div>
<?php endif; ?>

is_array( $image ) で守っているのは、画像フィールドのReturn Formatが3種類あるからです。ACF公式は「画像配列(array)/画像URL(string)/画像ID(integer)から選ぶ」と説明しています(出典: Image – Advanced Custom Fields)。$image['url'] という書き方は「画像配列」を選んでいるときにしか成立しません。サンプルコードをそのまま貼って画像が出ないときは、まずこの設定を疑ってください。

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

「映画」「商品」「求人」のように、投稿とは別の種類の記事を増やす仕組みがカスタム投稿タイプです。カスタムフィールドは、これと組み合わせたときに一番効きます。投稿タイプごとに専用のフィールドグループを割り当てれば、編集画面には必要な入力欄だけが並び、テンプレートも投稿タイプ単位で分けられるからです。作り方はカスタム投稿タイプの作り方で扱っています。

この記事の次に進む先

ここまでは「保存された値を読んで出す」側の話でした。プラグインに頼らず入力欄そのものを自作したい——つまり値を保存する側を書きたくなったら、権限チェックやnonce、保存前のサニタイズが必要になります。実装手順は投稿にSEOタイトル・メタ欄を自作する方法にまとめてあります。投稿ではなくカテゴリやタグに値を持たせたい場合はタームにメタ情報を実装する方法が対応します。

また、フィールドが増えてくると「投稿一覧でどの記事に値が入っているか分からない」という問題が出ます。管理画面側の見せ方はACFで管理画面をカスタマイズする方法で扱っています。テンプレートファイルの分割や階層そのものに不安があるならテンプレートファイルの基本へ戻ってください。


動いたかを確かめる|値を空にして表示が消えれば合格

コードを貼ってフロントに文字が出ても、それだけでは「カスタムフィールドの値が出ている」証拠になりません。テンプレートに文字列を直接書いても、見た目は同じになるからです。合否は次の1点で判定します。管理画面で値を入力すると表示され、値を空にして更新すると表示も消える。消えなければ、画面に出ているのはフィールドの値ではありません。

判定の手順

  1. フィールドに値を入れて更新し、フロントを再読み込みして表示されることを確認する。
  2. 同じフィールドの値を空にして更新し、もう一度フロントを再読み込みする。
  3. 表示が消えれば合格。ここまで来ていれば、値の登録から出力までの経路がつながっています。
  4. 消えなければ、次の切り分けへ進む。

消えなかったときに見る2つの実データ

推測で直そうとすると迷子になります。実際に保存されているものを画面に出して確かめます。次のコードを、表示コードのすぐ上に一時的に置いてください。確認が終わったら必ず削除します(保存されている値がそのまま読者に見えるため、本番に残してはいけません)。

<?php
// 検証1: この投稿に実際に保存されているメタキーを全部出す
// (第2引数を省略すると、全キーの配列が返る)
$all_meta = get_post_meta( get_the_ID() );
echo esc_html( implode( ' / ', array_keys( $all_meta ) ) );

// 検証2: 同じキーを $single=true と false で取り出して、返る型を見比べる
$single_value = get_post_meta( get_the_ID(), 'my_custom_field', true );
$array_value  = get_post_meta( get_the_ID(), 'my_custom_field', false );
echo esc_html( var_export( $single_value, true ) );
echo esc_html( var_export( $array_value, true ) );

2つの出力を、次の表に突き合わせます。

検証1・2で見えたもの原因次の一手
検証1にキー名が出てこないキー名のスペルミス、または値が保存されていない検証1に出た正しいキー名をコードに書き写す
キー名はあるが、先頭が _ で始まる別名になっているアンダースコア始まりは「保護されたメタ」として管理画面の一覧から隠されるキー名から先頭の _ を外して作り直す
検証2で値が取れているのに、フロントの文字が消えないテンプレート側に文字列が直書きされていて、フィールドの値を出力していない直書きの文字列を get_post_meta() の出力に置き換える
検証2の true 側が空文字、false 側が空配列その投稿にはまだ値が保存されていない編集画面で値を入力して更新し、手順1からやり直す

検証2の見方を補足します。$singlefalse なら配列、true なら値そのものが返ります。繰り返しになりますが、true は「値が1つのときだけ」ではなく複数あっても常に先頭1件を返します。また値は数値でも文字列で返るため、ループ回数や計算に使うときは absint() で変換してください。編集画面のキー名プルダウンに目当てのキーが並んでいなくても問題ありません。表示されるのは先頭30件までなので、手入力で同じキーを指定すれば同じ場所に保存されます。

表の「次の一手」は、すべてその場で完了する操作です。ここでテンプレート階層を調べ直したり、キャッシュを疑い始めたりする必要はありません。手を打ったら手順1に戻り、もう一度「値を空にすると表示も消えるか」だけを見てください。消えたなら、WordPressテーマ開発ガイドの4段階の到達判定に戻って、段階3にチェックを付けて先へ進めます。


まとめ|「値を空にすると消える」まで確かめて終わりにする

カスタムフィールドは、投稿に「決まった形の情報」を持たせるための標準機能です。入力欄は標準機能でもACFでも用意でき、表示側はテンプレートに get_post_meta() / get_field() を書くか、WordPress 6.5以降ならブロックバインディングでブロックに結びつけるかを選べます。

詰まりやすいのは、機能そのものより設定と型です。ACFのReturn Formatが日付と画像の返り値を変えること、値は数値でも文字列で返ること、リピーターは無料版に無いこと。この3つを先に押さえておくだけで、原因不明の「表示されない」はほとんど起きなくなります。

そして最後に、必ず値を空にして更新してみてください。表示も一緒に消えれば完成です。消えないなら、画面に出ているのは直書きの文字列です。


よくある質問(FAQ)

Q. カスタムフィールドとは何ですか?

WordPressの投稿や固定ページに、タイトルと本文以外の追加情報を「キーと値」の組で保存できる標準機能です。価格・住所・評価点数など、記事ごとに形式が決まっているデータの管理に適しています。入力欄は標準機能のままでも表示でき、ACFなどのプラグインを使えば日付や画像といった入力形式を指定できます。

Q. 値を空にしても表示が消えないのはなぜですか?

テンプレート側に文字列が直書きされていて、フィールドの値を出力していないためです。この場合、画面に出ているのはカスタムフィールドの値ではありません。まず get_post_meta( get_the_ID() ) で保存済みのキー一覧を出し、キー名が合っているかを確認したうえで、直書きの文字列を取得関数の出力に置き換えてください。

Q. ACFとSecure Custom Fieldsはどちらを使えばよいですか?

どちらか片方に決めて使ってください。両方を有効化することはできず、Secure Custom Fieldsは有効化時に機能が重複するACFを停止すると公式ページで案内されています。リピーターやオプションページを費用をかけずに使いたいならSecure Custom Fields、既存案件や解説記事との一致を優先するならACFが選びやすい選択肢です。

Q. リピーターフィールドが選択肢に出てこないのはなぜですか?

リピーターはACF PROの機能で、無料版のフィールドタイプ一覧には表示されないためです。ACF公式はリピーターのほか、フレキシブルコンテンツ・ギャラリー・オプションページ・クローン・ACFブロックをPRO限定機能として案内しています。無料で同等の機能を使いたい場合はSecure Custom Fieldsが選択肢になります。

Q. カスタムフィールドの一覧に出てこないキーがあります。どうすればよいですか?

2つの理由が考えられます。キー名がアンダースコアで始まっている場合は「保護されたメタ」として一覧から隠されるため、先頭の _ を外したキーで作り直してください。単に並んでいないだけなら、プルダウンに表示されるのが既定で先頭30件までという制限によるものなので、キー名を手入力すれば同じキーに保存できます。

Q. ブロックバインディングを使えばPHPは不要になりますか?

用途によります。見出し・段落・画像・ボタンなど対応済みのブロックに値を1つ出すだけなら、テンプレートPHPを書かずに完結します。ただしメタキーを show_in_rest 付きで登録する処理はPHPで書く必要があり、複数の値を組み合わせる表示や条件による出し分けも対応範囲外です。その場合は従来どおりテンプレートに実装します。

Q. get_post_meta() と get_field() はどちらを使うべきですか?

ACFを使っていないなら get_post_meta()、ACFで作ったフィールドを読むなら get_field() です。get_field() はACFのフィールド設定(Return Formatなど)を反映した値を返すため、日付や画像を扱うときに扱いやすくなります。一方でACFを外すと動かなくなるので、プラグインに依存させたくない箇所は get_post_meta() で書きます。