have_rows()

Обзор

Эта функция проверяет, имеет ли поле (например, поле Повторитель или Гибкое содержимое) данные, которые нужно перебрать. Это логическая функция и она возвращает 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(), будет находить только данные из текущей итерации, а не из родительских или дочерних.

Похожие