2017年10月2日

Advanced Custom Fields の field_key を取得する方法

現代のWordPress開発に無くてはならないAdvanced Custom Fields(以下ACF)、その便利さは時として仇となります。。
詳しい話は記事タイトルから離れてしまうので要約すると、、、

ACFは基本的には field_name で運用できます。
get_field( 'zip_code' );
など。
しかし、少し込み入った使い方をしたい時 field_key でないと完全な動作が得られない事があります。
update_field( 'field_12a3b45c678d9' )
update_field なんかはいい例です(field_name で行った時と動作が変わります)

そんな時、なんとかして field_key を取得したいんですがなかなかスマートな方法が有りません。
また、この記事を書くことになる前、ACFのフォーラムやStackTraceを探しましたが、けっこう古い情報でどれも動作しませんでした。
バージョンによって有効な方法が変わったのかもしれません。。

という事で、2017年10月現在、Version 4.4.12 (ACF PRO 5.3.6.1)にて、有効な field_key の取得方法はコチラです。
function get_acf_key($field_name) {
 global $wpdb;
 $sql = "SELECT `post_name` FROM {$wpdb->posts} WHERE `post_excerpt` = '{$field_name}'; ";
 $field_key = $wpdb->get_var($sql);
 if ( is_null($field_key) ) {
  $field_key = $field_name;
 }
 return $field_key;
}

使い方

update_field( get_acf_key( 'zip_code' ), $value, $post_id );
万が一 field_key が見つかった場合は、渡された field_name をそのまま返すので、そのまま必要な箇所にぶち込んで使えます。
と思ったけど、複数ヒットしちゃったら配列返るからヤバイねw

解説

ご覧の通り、近年稀に見るSQLべた書きです。(おおよその事はWP_Queryで解決しちゃうからね〜)
ポイントは、 post_excerpt を検索していること。
管理画面で作成したACFのカスタムフィールドは、管理用の投稿タイプ acf-field に、1ポスト1フィールドという形で保存されます。
その際、ラベルは title に、field_name は post_excerpt に、そして field_key は post_name に割り当てられ、保存されます。
なので、 post_excerpt を field_name の値で検索し、 post_excerpt をセレクトすればOKと!

しかしまぁ面倒くさい話です。
公式もこれくらいメソッド化しといてよね〜

0 件のコメント:

コメントを投稿

OpenIDからもお気軽にどうぞ!