system
マリンロード

2020.1.27HTML/CSS システム開発 

マリンロード

Advanced Custom Fieldsのフィールドキーを動的に取得する方法

マリンロードスタッフブログをご覧いただいている皆様、こんにちは。
フロントエンドエンジニアの虎澤です。

WordPressでのサイト組み込みをする際、弊社でよく利用するのが「Advanced Custom Fields」です。
記事や固定ページ、ユーザー情報などにカスタムフィールドを設定でき、柔軟なコンテンツ作りが可能になるプラグインです。
記事などに紐づいたカスタムフィールドの値を持ってくることは、公式のマニュアルにもあるので簡単にできるのですが、
カスタムフィールド自体の登録情報を持ってくる方法までは紹介されていないんですよね。(たぶんですが。。)
そこで、カスタムフィールドのラベル名もしくは名前から、データを取得する関数を自作してみましたのでご紹介したいと思います。

function get_acf_fieldkey($arg){
 $args = array(
  ’posts_per_page’ => -1,
  ’post_type’ => ‘acf-field’,
  ’post_status’ => ‘publish’,
 );
 $the_query = new WP_Query($args);
 if($the_query->have_posts()){
  while($the_query->have_posts()){
   $the_query->the_post();
   global $post;
   if(get_post_status($post->post_parent) != ‘acf-disabled’){
    $acfFieldkeys[] = array(
     ’id’ => $post->ID,
     ’parent_id’ => $post->post_parent,
     ’parent_name’ => get_the_title($post->post_parent),
     ’label’ => $post->post_title,
     ’name’ => $post->post_excerpt,
     ’field_key’ => $post->post_name,
    );
   }
  }
  $acfFieldkeys = json_decode(json_encode($acfFieldkeys));
 }
 wp_reset_postdata();

 if(!empty($acfFieldkeys)){
  foreach($acfFieldkeys as $val){
   if($val->label == $arg || $val->name == $arg){
    $fieldkey = $val->field_key;
    break;
   }
  }
 }
 return $fieldkey;
}

ACFのカスタムフィールドはカスタム投稿タイプとして投稿されているようなので、
まず投稿タイプが「acf-field」で公開済みステータスの記事を全件取得します。

if(get_post_status($post->post_parent) != ‘acf-disabled’){
 $acfFieldkeys[] = array(
  ’id’ => $post->ID,
  ’parent_id’ => $post->post_parent,
  ’parent_name’ => get_the_title($post->post_parent),
  ’label’ => $post->post_title,
  ’name’ => $post->post_excerpt,
  ’field_key’ => $post->post_name,
 );
}

上記のget_post_status($post->post_parent) != ‘acf-disabled’ですが、なぜこうしているのかというと、
各フィールドにはフィールドグループという親があり、そのフィールドグループも投稿で登録されているからです。
フィールドグループ改修するのにバックアップを取って、無効化している場合などに、そのデータを取得しないようにするためです。
また、わざわざ配列をオブジェクトに変換したりしていますが、これは必須ではありません(むしろ配列のまま扱うほうが良いと思います。。)

if(!empty($acfFieldkeys)){
 foreach($acfFieldkeys as $val){
  if($val->label == $arg || $val->name == $arg){
   $fieldkey = $val->field_key;
   break;
  }
 }
}
return $fieldkey;

必要なカスタムフィールドの情報を取得したら、引数に設定されているラベル名もしくは名前と一致する「フィールドキー値」を返します。
これは要件によって、カスタムフィールドの配列を丸ごと返してもいいですし、色々とカスタマイズできると思います。

if(!empty($fieldkey)){
 $fields = get_field_object($fieldkey);
 $list = array();
 foreach($fields as $key => $val){
  if($key == ‘choices’){
   foreach($val as $elem_key => $elem_val){
    $list[] = $elem_val;
   }
  }
 }
}

あとは、たとえばセレクトボックス形式のカスタムフィールドの値を取得したい場合は、上記のようにします。
これで$listにはフィールドに登録されている内容が入ることになるので、それを素に機能を組み込んでいきます。

今回はあえてカスタムフィールドの情報を全件取得していますが、もっと限定的にしてもいいかなと思います。
もしくは、全件取得した上で、引数によって返す値を変えられるように拡張したりしてみてもおもしろいかもしれません。

以上、虎澤でした。

現役ウェブ解析士が教えるWebサイトの読み解き方 イメージ
ホームページ制作サービスはこちら
ページTOPへ