Работа с вложенными повторителями

Обзор

Создавать и отображать вложенные поля Repeater / Flexible Content очень просто с помощью плагина Advanced Custom Fields. В этой статье мы покажем, как построить простой список дел, использующий вложенный repeater для вывода групп элементов.

Группа полей

Ниже приведен скриншот, показывающий группу полей, используемую для этого списка дел, а также правила расположения, определяющие, когда должна отображаться эта группа полей.

На этом скриншоте показана группа полей ACF, используемая для этого списка дел. Она состоит из поля Repeater с двумя подполями: текстового поля для указания названия задачи и поля True/False для указания, выполнена задача или нет.

Данные

Ниже приведен скриншот страницы, на которой отображается эта группа полей. Как показано выше, в качестве правила расположения использовался шаблон страницы «Список дел», чтобы прикрепить группу полей к странице.

На этом скриншоте показана страница в админке WordPress, на которой отображается группа полей списка дел.

Шаблон

Теперь, когда мы создали группу полей и заполнили данные для нашего списка дел, мы можем пройтись по ним циклом и вывести данные в шаблоне. Это руководство предполагает, что файл шаблона для «Списка дел» уже существует, так что давайте отредактируем этот файл. В следующем коде мы будем использовать эти функции:

  • have_rows() – позволяет нам перебирать доступные строки в поле repeater / flexible content
  • get_sub_field() – возвращает значение подполя (из текущего repeater в “has_sub_field”)
  • the_sub_field() – выводит значение подполя (из текущего repeater в “has_sub_field”)
<?php

/**
 * Template Name: Список дел
 */

get_header(); ?>

    <div id="primary">
        <div id="content" role="main">

            <?php while ( have_posts() ) : the_post(); ?>

                <h1><?php the_title(); ?></h1>
                <?php the_content(); ?>

                <?php 

                // проверяем наличие строк (родительский repeater)
                if( have_rows('to-do_lists') ): ?>
                    <div id="to-do-lists">
                    <?php 

                    // перебираем строки (родительский repeater)
                    while( have_rows('to-do_lists') ): the_row(); ?>
                        <div>
                            <h3><?php the_sub_field('title'); ?></h3>
                            <?php 

                            // проверяем наличие строк (подрепитер)
                            if( have_rows('items') ): ?>
                                <ul>
                                <?php 

                                // перебираем строки (подрепитер)
                                while( have_rows('items') ): the_row();

                                    // выводим каждый элемент как пункт списка — с классом completed (если он выполнен)
                                    ?>
                                    <li <?php if( get_sub_field('completed') ){ echo 'class="completed"'; } ?>><?php the_sub_field('name'); ?></li>
                                <?php endwhile; ?>
                                </ul>
                            <?php endif; // если( get_sub_field('items') ): ?>
                        </div>    

                    <?php endwhile; // while( has_sub_field('to-do_lists') ): ?>
                    </div>
                <?php endif; // если( get_field('to-do_lists') ): ?>

            <?php endwhile; // конец цикла. ?>

        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

Ниже приведен скриншот, показывающий HTML, созданный на основе приведенного выше кода.

Вывод

Работать с вложенными повторителями просто, но иногда это может запутать. Чтобы упростить жизнь, старайтесь использовать простые имена полей. Помните, что подполям тоже можно давать те же имена, что и у родительских полей, так что нет необходимости придумывать длинные уникальные имена.

Обновлено: 01.06.2026