• home
  • WordPressのプラグイン、ACF(Advanced Custom Fields)で作成したカスタムフィールドの値を更新する方法 update_field

WordPressのプラグイン、ACF(Advanced Custom Fields)で作成したカスタムフィールドの値を更新する方法 update_field

Wordpressのプラグイン、ACF(Advanced Custom Fields)で作成したセレクトボックスやチェックボックス、リピーターフィールドの値を更新するノウハウ

WordPressのプラグインのACF(Advanced Custom Fields)は管理画面をカスタマイズするのに非常に便利です。
チェックボックスやセレクトボックス、デイトピッカー等でクライアントの要求に応じた使いやすい管理画面を作成する事が出来ます。

ACFは利用者側から見ると便利ではあるのですが、後からフィールドの値を更新する場合、ケースによっては通常の更新が困難な事があります。

結論

結論から言うと update_field() というACFの関数を利用します。
ACF | update_field()

本来Wordpressのカスタムフィールドの更新は update_post_meta() 関数を利用するのが一般的です。
単なる値をシンプルに格納している「テキスト」「テキストボックス」等であれば update_post_meta() でも更新は可能です。

問題になるのは複数値を格納するタイプの「チェックボックス」「セレクトボックス」「リピーター」等です。
これはACFのカスタムフィールド自体が複数値の場合独自にシリアライズ化したarrayとして格納している為。(さらにリピーターフィールド等だとフィールド名自体が複数追加されるのでフィールド名がシリアライズ化されている)
ACFが用意したupdate_post_meta() 関数を使わないと変な事になりますよという事のようです。

通常の値の「更新」

<?php
  update_field( 'フィールド名', '値', $post_id );
?>

このように通常の値の場合は update_post_meta() 関数とあまり差がありません。

値の「追加」

<?php
//通常の値の更新
$field_key = "field_123456";
$value = "更新する値";
update_field( $field_key, $value, $post_id );

//チェックボックス、セレクトボックス
$field_key = "field_1234567"; //フィールドキー※
$value = array("赤", "青", "緑"); //更新する値、複数可
update_field( $field_key, $value, $post_id );

// リピーターフィールド(有料追加プラグイン)
$field_key = "field_12345678";
$value = array(
    array(
        "sub_field_1"   => "ほげ",
        "sub_field_2"   => "ふが"
    )
);
update_field( $field_key, $value, $post_id );
?>

ここで重要なのが フィールドキー です。本来通常の値の更新のようにフィールド名がセレクタになっているかと思いきや、
フィールドキーを指定しなければ更新されません。

理由はACF | update_field()に書いてある通り、フィールド名での指定は「既に値が存在している場合のみ」指定が可能で、「新規で値を追加する」場合はフィールドキーを使えという事になっています。

ここで結構詰まりました。フィールドを追加した後に一度でも記事自体を更新している記事に関してはフィールド名で更新されるのに、過去記事に一括で更新しようとすると更新されない…!理由はそのままACF公式に書かれている通りでした。
過去記事は一度もフィールドを追加後に更新されておらず、フィールド名自体が記事に存在しないので追加扱いなんですね。

また、フィールドキーの取得にも少々手こずりました。
フィールドグループの作成画面の該当フィールドを右クリックし要素を検証、DOM内の data-id の値がフィールドキーのようです。
フィールドキーの後ろに付いてる数値はシリアライズ化されているので、フィールド名からDBを探してフィールドキーを探すよりはこちらのほうが現実的なようです。

About

Wanoグループのエンジニアやデザイナーが使っている技術、興味のある技術、(色んな意味で)はまっている技術などをお伝えしていきます。