みんな大好き(※個人の感想です)ACF Pro の繰り返しフィールドですが、新規投稿で任意の繰り返しフィールドを自動で作成して値をセットする方法です。
建築設計事務所のポートフォリオサイトなどに WordPress を組み込む際に、スペック(諸元)の入力欄を用意することがよくあります。たとえば以下のような感じ。
名称: 〇〇幼稚園
所在地: 神戸市〇〇区
竣工: 2020年〇月
規模: 〇〇平米
施主: 学校法人〇〇
施工: 株式会社〇〇工務店
設計: 〇〇設計事務所
テキストエリアで自由入力というパターンが多いのですが「入力欄を別個に作ってほしい」というご要望がちょいちょいあります。しかも「名称」などの項目名や、全体の項目数は可変で、しかも項目名や値が空のものは出力しないで…というご要望。
ACF Pro の繰り返しフィールド+グループフィールドを使って、定型入力されそうな項目名はあらかじめ入力されてる状態にしておくとユーザーさんも楽でよい。
ACF のフィルターフックを使って実装します。シンプルなテキストの繰り返しフィールドの場合は以下のようになります。
function my_acf_load_repeater_value($value, $post_id) { // 投稿を新規追加する際にのみ実行 if (get_post_status($post_id) === 'auto-draft') { // 投稿タイプの判定(任意) if (get_post_type($post_id) == 'post') { // セットする値の配列を作成して返す // 'field_aaaaaaaaaaaaa' はサブフィールド(テキストフィールド)のキー $value = array(); $value[] = array( 'field_aaaaaaaaaaaaa' => 'テスト1' ); $value[] = array( 'field_aaaaaaaaaaaaa' => 'テスト2' ); $value[] = array( 'field_aaaaaaaaaaaaa' => 'テスト3' ); } } return $value; } // 'field_bbbbbbbbbbbbb' は繰り返しフィールドのキー add_filter('acf/load_value/key=field_bbbbbbbbbbbbb', 'my_acf_load_repeater_value', 10, 2);
実行結果は以下。
で、スペックを入力するためには「項目名」と「値」の組が必要なので、繰り返しフィールドのサブフィールドをテキストフィールドではなくグループフィールドにします。
このグループフィールド内のテキストフィールド label に値をセットする場合は以下のようになります。
function my_acf_load_repeater_value($value, $post_id) { // デフォルトでセットしたい値 $array_values = array( '名称', '所在地', '竣工', '規模', '施主', ); if (get_post_status($post_id) === 'auto-draft') { if (get_post_type($post_id) == 'post') { $value = array(); $cnt = 0; foreach ($array_values as $val) { // 'field_aaaaaaaaaaaaa' はサブフィールド(グループフィールド)のキー // 'field_ccccccccccccc' はグループフィールド内のサブフィールド(テキストフィールド)のキー $value[$cnt]['field_aaaaaaaaaaaaa']['field_ccccccccccccc'] = $val; $cnt++; } } } return $value; } // 'field_bbbbbbbbbbbbb' は繰り返しフィールドのキー add_filter('acf/load_value/key=field_bbbbbbbbbbbbb', 'my_acf_load_repeater_value', 10, 3);
実行結果は以下。
各フィールドのキーは、ACF のカスタムフィールドをエクスポートすると確認できます。