【WordPress】Groupフィールドのサブフィールドを扱う

以前にHTMLフォームを自作して、その値を更新する方法についての記事を書きましたが。

その中で、Advanced Custom Field(以下、ACF)のGroupフィールドのサブフィールドの値を更新する方法についても書きました。

日々作業を行ってる中で、サブフィールドを扱ってあれやこれやすることがあり。

まとめておこうかなと思った次第です。

Groupフィールドとは

Groupフィールドは、ACFに用意されているカスタムフィールドの一つで、カスタムフィールドのグループを作ることができます。

よくわからなくなるかもしれませんが、カスタムフィールドのまとまりを作るためのカスタムフィールドです。

例えば、アンケートフォームの氏名入力の時に、「名前」というラベルがあって「氏」と「名」に分かれたものを見たことがあると思います。

あんな感じです。

この例の場合、「名前」がGroupフィールドで、メインのカスタムフィールドとなります。

そして「氏」や「名」はGroupフィールド内にあるカスタムフィールドなので、「サブフィールド」と呼ばれます。

なので実際に値があるのは「サブフィールド」の中ということになり。

実際に利用するには、「サブフィールド」の値をごにょごにょすることになります。

サブフィールドの呼び出し方

サブフィールドの値がどの用に保存されているかというと、Groupフィールドの連想配列として保存されています。

正確には違うかもしれませんが。

'Groupフィールド' = array(
   'サブフィールド名1' => 'サブフィールド1の値',
   'サブフィールド名2' => 'サブフィールド2の値'
);

という感じだと思います。

なので、基本的にはGroupフィールドのループ内で呼び出すということになります。

ループ内であれば、the_sub_field()で呼び出すことができます。

<?php
if( have_rows( 'Groupフィールド名' ):
  while( have_rows( 'Groupフィールド名' ): the_rows();
?>

<p><?php echo the_sub_field( 'サブフィールド名' ); ?></p>

<?php
  endwhile;
endif;
?>

サブフィールドの値を利用する場合は、get_sub_field()というのもあるみたいです。

ちなみに、have_rows()はワードプレス関数っぽいですがACFのループ関数ですね。

わかりやすくするために、このような設計にしたそうです。

ただ、個人的にはGroupフィールドのループはあまり使わず。

外部から参照することが多いので、get_field()で呼び出すことが多いです。

//サブフィールドの値の取得
$test = get_field( 'Groupフィールド名', $post_id )[ 'サブフィールド名' ];

これで変数をechoしたり、条件分岐に使ったりします。

絞り込み検索の条件としてフィールドを指定する場合

値を取得してゴニョゴニョする分には上記の内容で良いですが。

クエリのパラメータにする場合、指定された値を探す場所を入れておかなければなりません。

つまり、meta_queryのkeyに値を探すサブフィールド名を指定する必要があります。

少し調べて見ると、どうも'Groupフィールド名’'サブフィールド名’「_」(アンダーバー)で繋げばサブフィールド名を指定していることになるみたいです。

//クエリの一部
'meta_query' => array(
      'relation' => 'AND',
      array(
        //サブフィールド1
        'key' => 'Groupフィールド名_サブフィールド1名',
        'value' =>  '探す値',
        'compare' => '=',
      ),
    ),

これはわかりやすくて良いですね。

ちょうど実装する案件が複数のGroupフィールドから検索するものだったので、それぞれ変数にしても動いてくれました。

$group_name = 'グループフィールド名';
$sub_field_name = 'サブフィールド名';

//クエリの一部
'meta_query' => array(
      'relation' => 'AND',
      array(
        //サブフィールド1
        'key' => $group_name . '_' . $sub_field_name,
        'value' =>  '探す値',
        'compare' => '=',
      ),
    ),

正直、ACFのこういった参照はフィールド名では動かない印象なんですが。

サクッと動いてくれて助かりました。

だめなら、フィールドキーで同じ操作を行えば大丈夫だと思います。

絞り込み検索についてはこちらをどうぞ!

Groupフィールドも便利に使える

通常のカスタムフィールドではないので、少し違った呼び出し方をしますが。

入力する側からすると、関連する項目が並ぶことになるので何を入力すれば良いのかわかりやすいですし。

便利なフィールドだと思ってます。

といっても、普段はget_field()を使うことに慣れすぎて。

この記事を書くまではthe_sub_field()の存在を忘れてたんですけどね。

参考:ACFのグループフィールドの使い方と実装例の紹介‐うさぎコード

参考:WordPressカスタムフィールドに入力した値でクエリを絞り込んだりソートしたりする‐はなゐろぐ

参考:[WordPress]ACFのGroupのサブフィールド値を条件にget_postsする方法‐W by KOP