ACFのグループフィールド内で繰り返しフィールドを使う方法【二重ループ】

公開日
最終更新日
ACF グループフィールドの中で繰り返しフィールドを使う方法

ACF(Advanced Custom Fields)でフィールドを整理していると、グループフィールドの中に繰り返しフィールド(リピーターフィールド)を入れる構成にすることがあります。このとき、PHP側でどうループを書けばいいか、少し迷いやすいポイントです。

結論から言うと、まずグループフィールドをループし、その内側でさらに繰り返しフィールドをループするという二重のwhileで取得します。この記事では、実際のフィールド設計例とあわせて、その書き方を解説します。

フィールドの設計例

たとえば、次のようにACFを設計したとします。グループフィールドの中に、繰り返しフィールドが入っている構成です。

この構成の値を取り出すには、グループの階層を1つ入ってから繰り返しフィールドを回す必要があります。グループフィールドは、複数の項目を1つのまとまりとして管理できるため、たとえば「セクション」という単位で見出し・本文・画像などをまとめ、その中に繰り返し項目を持たせる、といった設計で活躍します。

二重ループで取得する

グループ内の繰り返しフィールドをループするには、グループをhave_rows()でループし、その内側で繰り返しフィールドをもう一度have_rows()でループします。

<?php while (have_rows('group')) : the_row();
    while (have_rows('repeat')) : the_row();
        // vars
        $title = get_sub_field('title');
        $text = get_sub_field('text');
?>
        <div class="title"><?php echo $title; ?></div>
        <div class="text"><?php echo $text; ?></div>
<?php
    endwhile;
endwhile; ?>

この書き方で、グループ内の繰り返しフィールドの各行を取り出せます。

コードのポイント

押さえておきたいのは、外側のループが「グループの階層に入る」役割を担っている点です。グループフィールドは、内部的には1行の繰り返しフィールドのように扱われます。そのため、いきなりhave_rows('repeat')と書いてもグループの中の繰り返しフィールドは見つからず、まずhave_rows('group')で階層を1つ下りてから、内側のhave_rows('repeat')を回す必要があります。

内側の繰り返しフィールドの値は、通常どおりget_sub_field()で取得できます。the_row()を外側・内側それぞれで呼ぶのを忘れないようにすれば、迷うことはありません。

なお、grouprepeattitletextといった名前は、実際に設定したフィールド名に置き換えてください。フィールド名が一致していないと値が取得できないので、ここは設計と揃えるのが確実です。

配列として受け取る書き方

have_rows()のループのほかに、グループフィールドを配列として受け取ってから中の繰り返しフィールドを回す方法もあります。get_field('group')でグループ全体を取得すると、その中に繰り返しフィールドが配列として入っています。

<?php
$group = get_field('group');
if ($group && !empty($group['repeat'])) {
    foreach ($group['repeat'] as $row) {
        echo '<div class="title">' . esc_html($row['title']) . '</div>';
        echo '<div class="text">' . esc_html($row['text']) . '</div>';
    }
}
?>

どちらの書き方でも結果は同じです。have_rows()のループはACFらしい定番の書き方で、配列をforeachで回す書き方は、取得したデータを他の処理にも使い回したいときに向いています。好みや状況に合わせて選んでください。

つまずきやすいポイント

この構成でよくあるミスが、外側のグループのループを書かずに、いきなり内側の繰り返しフィールドを回そうとすることです。その場合、繰り返しフィールドが見つからず、何も表示されません。「グループの中に入る」ワンステップが必要だと覚えておきましょう。

また、the_row()を外側・内側のそれぞれで呼び忘れると、行が進まず無限ループになったり、値が取れなかったりします。二重ループを書くときは、各whileの先頭にthe_row()があるかを必ず確認してください。

まとめ

  • グループ内の繰り返しフィールドは、グループ→繰り返しフィールドの二重ループで取得する
  • 外側のhave_rows('group')でグループの階層に入るのがポイント
  • 値はget_sub_field()で取得し、フィールド名は設計に合わせる

グループフィールドで項目をまとめておくと、管理画面が整理されて運用しやすくなります。二重ループの書き方さえ押さえておけば、グループと繰り返しフィールドを組み合わせた設計も自在に扱えます。

IPPEI FUKUTA(株式会社バッズブルー 代表)

IPPEI FUKUTA(株式会社バッズブルー 代表)

WordPress専門のWeb制作者として15年・150サイト以上を担当。現場でつまずいた問題と解決策を、同じ制作者・フリーランスの方に向けて発信しています。無料のWeb便利ツール集「バドツール」を開発・運営中。