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()を外側・内側それぞれで呼ぶのを忘れないようにすれば、迷うことはありません。
なお、groupやrepeat、title、textといった名前は、実際に設定したフィールド名に置き換えてください。フィールド名が一致していないと値が取得できないので、ここは設計と揃えるのが確実です。
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()で取得し、フィールド名は設計に合わせるグループフィールドで項目をまとめておくと、管理画面が整理されて運用しやすくなります。二重ループの書き方さえ押さえておけば、グループと繰り返しフィールドを組み合わせた設計も自在に扱えます。