У книги может быть разное количество глав. Если завести поля «Глава 1», «Глава 2», «Глава 3» и так далее, форма быстро станет неудобной: коротким книгам останутся пустые поля, а для длинных придётся заранее создавать запас. Поле Repeater решает эту задачу: редактор добавляет ровно столько строк, сколько нужно.

Сначала проверьте доступность поля

Repeater входит в ACF PRO. Если у вас бесплатная версия ACF, этот тип поля будет недоступен. Сам PHP-цикл ниже можно изучить отдельно, но для настоящей формы Repeater понадобится ACF PRO. Не путайте его с обычным полем «Текстовая область»: Repeater хранит список однотипных строк, каждая из которых может содержать несколько подполей.

Настраиваем список глав

В группе «Данные книги» добавьте поле типа Repeater с именем book_chapters. Внутри него создайте два подполя:

  • chapter_title — поле «Текст» с подписью «Название главы».
  • chapter_summary — поле «Текстовая область» с подписью «Краткое содержание».

В параметрах Repeater задайте понятную подпись кнопки, например «Добавить главу». Если допустимы только книги с хотя бы одной главой, задайте минимальное число строк. Максимум можно установить, если проекту нужно ограничение. Для удобства редактора выберите блочный вид строк: каждую главу легче читать и менять по отдельности.

Выводим строки в шаблоне

ACF предоставляет цикл have_rows(), переключение на следующую строку через the_row() и получение значения подполя через get_sub_field(). Добавьте в шаблон книги:

<?php if ( have_rows( 'book_chapters' ) ) : ?>
    <ol class="book-chapters">
        <?php while ( have_rows( 'book_chapters' ) ) : the_row(); ?>
            <li class="book-chapters__item">
                <?php $title = get_sub_field( 'chapter_title' ); ?>
                <?php if ( $title ) : ?>
                    <h3><?php echo esc_html( $title ); ?></h3>
                <?php endif; ?>

                <?php $summary = get_sub_field( 'chapter_summary' ); ?>
                <?php if ( $summary ) : ?>
                    <p><?php echo esc_html( $summary ); ?></p>
                <?php endif; ?>
            </li>
        <?php endwhile; ?>
    </ol>
<?php endif; ?>

Проверка have_rows() скрывает весь список, если редактор не добавил ни одной строки. Внутри цикла get_sub_field() обращается к полю текущей главы. Для каждой строки экранируйте значения по контексту: здесь заголовок и описание — обычный текст, поэтому подходит esc_html().

Не путайте Repeater и несколько записей

Repeater удобен, когда элементы принадлежат одной книге: главы, пункты комплектации, расписание внутри события. Если каждый элемент должен иметь собственную страницу, рубрики, автора или отдельный поиск, создайте для него самостоятельный тип записей и свяжите записи между собой. Так список не превращается в массив, который невозможно независимо редактировать и находить.

Большие списки строк могут усложнить редактирование. У ACF PRO есть настройка постраничной загрузки строк в админке; она облегчает работу с длинной формой, но не меняет смысл данных в шаблоне.

Проверка

  1. Добавьте две главы, заполните оба подполя и сохраните книгу.
  2. Откройте публичную страницу и проверьте порядок элементов.
  3. Удалите одну строку и убедитесь, что она исчезла из списка.
  4. Оставьте краткое содержание пустым: заголовок главы должен остаться, а пустой абзац — не появиться.

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

Документация

Продолжение мини-курса

  1. Предыдущая часть: собираем карточку книги.
  2. Создаём отдельный тип записей «Книги».
  3. Переносим группы полей через Local JSON.
  4. Ищем книги по полям ACF.