ACFの繰り返しフィールドで複雑なデータ構造を管理する|現場で使える実践テクニック

C
クリオ
Web制作ディレクター / フロントエンジニア

こんにちは!
今日は「ACFの繰り返しフィールドで複雑なデータ構造を管理する方法」について解説します。

繰り返しフィールドで失敗するよくあるパターン

ACFの繰り返しフィールド(Repeater Field)は、めっちゃ便利な機能やんけど、使い方を間違えるとクライアント側でめんどくさいことになるんですよね。
僕も以前、プロジェクト参考実績を管理するために繰り返しフィールドを使ったんですが、その時の失敗がホンマ印象的です。

何が問題だったかというと、繰り返しフィールドの中に「フィールドをめっちゃ詰め込みすぎた」んです。
具体的には:

  • プロジェクト名
  • プロジェクト説明
  • 開始日
  • 終了日
  • クライアント名
  • 予算
  • 成果物画像
  • テクノロジー(複数選択)
  • チームメンバー

こんな感じで、1つの行に10個近いフィールドが並んでしまいました。
クライアントが管理画面を開いた時、「うわ、何これ?」みたいな顔されたことを今でも覚えてます。
つまり、複雑すぎる繰り返しフィールドは、クライアント体験を著しく損なうということですね。

複雑なデータ構造を管理するための設計思想

では、複雑なデータを扱う場合、どうするべきか。
答えは「繰り返しフィールドの中に、さらに繰り返しフィールドを作る」です。
これを「ネストされた繰り返しフィールド」と言います。

基本的な設計のポイントは3つ:

  • 1階層目は「主要なデータ単位」に絞る
    例えば、プロジェクト管理なら「プロジェクト」という単位だけにします。
    プロジェクト名、説明、画像くらいですね。
  • 2階層目以降は「詳細情報」を分離
    テクノロジー、チームメンバー、期間などは別の繰り返しフィールドで管理します。
  • 「グループフィールド」と「繰り返しフィールド」を併用
    グループで構造化して、その中に繰り返しを入れると、クライアント側で管理しやすくなります。

現場でよく見るのは、設計段階で「全部1つのテーブルに入れたい」という発想です。
でもホンマのところ、エクセルでデータを整理する時だって、シートを分けたり、別テーブルにしたりしますよね。
WordPressのカスタムフィールドも、その感覚で設計するといいんです。

実装例:タイムラインデータの管理

具体的な例で説明しますね。
「サービスの成長の歴史」をタイムラインで表示したいというクライアント案件がありました。

最初は、1つの繰り返しフィールドで全部やろうと思ってたんですが、これをこうしました:

【ACFの構成】

  • グループフィールド: timeline_item(繰り返しフィールド)
    • テキスト: year(年号)
    • テキスト: title(イベント名)
    • テキスト: description(説明)
    • 繰り返しフィールド: milestones(その年の具体的なマイルストーン)
      • テキスト: milestone_title
      • テキスト: milestone_date(月日)
    • 画像フィールド: timeline_image

こうすることで、クライアント側では:

  • 年ごとに大きな単位で「追加」ボタンをクリック
  • その中で、より詳細なマイルストーンを必要に応じて追加

という、直感的で階層的な操作ができるようになりました。
クライアントからも「操作しやすい」って好評でしたね。

テンプレートでの取得と表示のコツ

ACFで複雑なデータ構造を作った時、テンプレート側でどう取得するかも大事です。

こんな感じで取得します:


<?php
if( have_rows('timeline_item') ) :
    while( have_rows('timeline_item') ) : the_row();
        $year = get_sub_field('year');
        $title = get_sub_field('title');
        
        if( have_rows('milestones') ) :
            while( have_rows('milestones') ) : the_row();
                $milestone_title = get_sub_field('milestone_title');
            endwhile;
        endif;
    endwhile;
endif;
?>

ポイントは、ネストされた繰り返しでも have_rows()the_row() の組み合わせで対応できるということですね。
複雑に見えるかもしれませんが、実はシンプルな入れ子構造です。

あと、めっちゃ大事なのが「取得前に値の存在確認をすること」です。
クライアントが一部のマイルストーンを追加してない場合もありますから、必ず have_rows() で確認してから get_sub_field() で取得する癖をつけておくといいですよ。

まとめ

ACFの繰り返しフィールドで複雑なデータを管理する時は、「1階層に詰め込みすぎない」これに尽きます。
グループと繰り返しを組み合わせて、階層的に構造化することで、クライアント側でも開発側でも扱いやすくなるんです。

最初は「そこまで複雑にしなくても」と思うかもしれませんが、実際に案件を運用していると、これくらいの配慮がホンマに大事だなって感じます。
クライアントが簡単に操作できれば、結果的にサポート業務も減るし、みんな幸せにな