Обзор
Эта функция проверяет, имеет ли поле (например, поле Повторитель или Гибкое содержимое) данные, которые нужно перебрать. Это логическая функция и она возвращает true или false.
have_rows() используется в связке с the_row(), чтобы обойти все доступные значения.
Использование have_rows() вместе с the_row() очень похоже на использование встроенных функций WordpPress have_posts() и the_post().
История изменений
- Добавлено в 4.3.0
Параметры
<?php have_rows($field_name, $post_id); ?>
- $field_name (строка) (обязательное) Имя повторителя или гибкого содержания, для обхода их значений.
- $post_id (смешанный) (необязательное) ID поста для которого сохранено поле. По умолчанию текущий пост. Также может быть таксономией, пользователем, страницей опций и т.д.
Использование
Базовый цикл
if( have_rows('parent_field') ):
while ( have_rows('parent_field') ) : the_row();
// Ваш код для итерации
the_sub_field('sub_field');
endwhile;
else :
// Значений не найдено
endif;
Цикл для поля «Повторитель»
<?php if( have_rows('repeater') ): ?>
<ul class="slides">
<?php while( have_rows('repeater') ): the_row();
$image = get_sub_field('image');
?>
<li class="slide">
<img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt'] ?>" />
<p class="caption"><?php the_sub_field('caption'); ?></p>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
Цикл для поля «Гибкое содержание»
<?php if( have_rows('flexible_content') ): ?>
<ul class="slides">
<?php while( have_rows('flexible_content') ): the_row(); ?>
<li class="slide">
<?php if( get_row_layout() == 'image_slide' ):
$image = get_sub_field('image');
?>
<img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt'] ?>" />
<?php elseif(get_row_layout() == 'video_slide' ): ?>
<?php the_sub_field('iframe'); ?>
<?php endif; ?>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
Вложенный цикл
В этом примере показано поле повторителя(locations), которое содержит некоторые базовые данные заголовка и описания, и в него вложено другое поле повторителя(staff_members), содержащее сотрудников.
<?php // Проверяем есть ли поля у цикла #1 ?>
<?php if( have_rows('locations') ): ?>
<div class="locations">
<?php // Выводим цикл #1 ?>
<?php while( have_rows('locations') ): the_row(); ?>
<div class="location">
<h3><?php the_sub_field('title'); ?></h3>
<p><?php the_sub_field('description'); ?></p>
<?php // Проверяем есть ли поля у цикла #2 (вложенный) ?>
<?php if( have_rows('staff_members') ): ?>
<ul class="staff-members">
<?php // Выводим цикл #2 (вложенный) ?>
<?php while( have_rows('staff_members') ): the_row();
$image = get_sub_field('image');
?>
<li>
<img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt'] ?>" />
<h4><?php the_sub_field('name'); ?></h4>
</li>
<?php endwhile; ?>
<?php // Конец цикл #2 (вложенный) ?>
</ul>
<?php endif; ?>
<?php // Конец теста для цикла #2 (вложенный) ?>
</div>
<?php endwhile; ?>
<?php // Конец цикла #1 ?>
</div>
<?php endif; ?>
<?php // Конец теста для цикла #1 ?>
Примечание
the_row()
Поскольку функция has_rows() не умеет переключаться на следующую итерацию цикла сама, использование этой функции без функции the_row() приведет к созданию бесконечного цикла, в результате чего будет белый экран.
Область действия
Имейте в виду, что область действия цикла has_rows() ограничена текущей итерацией. Это означает, что любая вложенная функция, такая как get_sub_field() или the_sub_field(), будет находить только данные из текущей итерации, а не из родительских или дочерних.
Похожие
- Цикл: get_row_index()