У книги может быть разное количество глав. Если завести поля «Глава 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 есть настройка постраничной загрузки строк в админке; она облегчает работу с длинной формой, но не меняет смысл данных в шаблоне.
Проверка
- Добавьте две главы, заполните оба подполя и сохраните книгу.
- Откройте публичную страницу и проверьте порядок элементов.
- Удалите одну строку и убедитесь, что она исчезла из списка.
- Оставьте краткое содержание пустым: заголовок главы должен остаться, а пустой абзац — не появиться.
Repeater избавляет от заранее заданного количества одинаковых групп полей. В следующей части решим другую задачу: как переносить определения полей между локальным сайтом и рабочим, чтобы не настраивать группы вручную дважды.
0
14