WordPress как на ладони
wordpress jino

Что такое цикл «the loop» в WordPress

Начал отвечать на один из комментариев о цикле loop в WordPress и решил, что это тема выходит за рамки ответа на комментарий. Этот пост может стать полезен новичкам и тем, кто еще плохо понимает как работает Цикл вывода записей в WordPress.

Что такое цикл в WordPress?

Начну с того, что говорить «цикл loop» — это неправильно. Это тоже самое, что сказать, - «цикл цикл», т.е. loop = цикл = повторяющееся действие. Правильно говорить просто «Цикл WordPress». Далее в тексте «Цикл WordPress» — тоже самое, что «loop», «the loop» или «цикл the loop WordPress».

Цикл в WordPress выглядит так:

<?php if ( have_posts() ) :  while ( have_posts() ) : the_post(); ?>
   <!-- 
	здесь формирование вывода постов,
	где работают теги шаблона относящиеся к the loop, например, the_title()
	-->
<?php endwhile; ?>
<?php endif; ?>

Однако у цикла WordPress могут быть и другие обличья, например он может выглядеть еще и так:

<?php
global $post;
$myposts = get_posts('numberposts=5&offset=1&category=1');
foreach( $myposts as $post ){
	setup_postdata( $post );
	?>
	<!-- 
	здесь формирование вывода постов,
	где работают теги шаблона относящиеся к the loop, например, the_title()
	-->
	<?php 
}
wp_reset_postdata();
?>

Если давать общее определение циклу в WordPress, то я бы сказал так: the loop - это цикл который перебирает массив содержащий в себе информацию о постах и во время перебора выводит информацию о каждом посте. При этом в цикле используются специально созданные для него теги шаблона: the_title(), the_permalink(), the_date() и т.д.

Вся информация о посте хранится в переменной $post. Предположим, что цикл обрабатывает массив содержащий в себе данные 10 постов, тогда у цикла будет 10 повторений и переменная $post будет меняться 10 раз, и при каждом повторении с переменной $post будет считываться информация о посте и выводится на экран, через теги шаблона: the_title(), the_content(). Также любой PHP или HTML код помещенный в цикл WordPress будет повторятся пока работает цикл: 10 итераций цикла - 10 повторений.

Типичный пример такого цикла — это вывод постов на странице категорий, меток, на главной странице WordPress.

Для чего нужно различать цикл WordPress?

Понимать где используется цикл нужно, потому что в WordPress есть определенные теги шаблона, которые не работают за пределами цикла, например: the_title(), the_content(), the_excerpt() и т.д. Для того, чтобы каждая такая функция (тег шаблона) сработала, должна быть определена переменная $post, которая за пределами цикла WordPress неизвестна (точнее не корректна, если цикл запускался, то $post известна - она содержит данные последнего, обработанного в цикле поста, но это уже другая тема).

Полный пример цикла

Приведу пример цикла WordPress (взял из Кодекса), со встроенными в код комментариями (внутри <!-- -->)

<!-- Проверка наличия записей в цикле -->
<?php if ( have_posts() ) : ?>

	<!-- Начало цикла -->
	<?php while ( have_posts() ) : the_post(); ?>
		<!-- Здесь уже определилась переменная $post, -->
		<!-- на основе которой будет строится дальнейший код. -->
		<!-- $post будет меняться для каждого поста while( have_posts() ). -->
		<!-- $post нужна, чтобы работали теги шаблона: in_category('3'), the_permalink() и т.д. -->

		<!-- Проверка находится ли этот пост в категории 3. -->
		<!-- Если да, то задаем CSS класс div-у class="post-cat-three". -->
		<!-- Если нет, то класс будет post class="post". -->
		<?php if ( in_category('3') ) { ?>
				  <div class="post-cat-three">
		<?php } else { ?>
				  <div class="post">
		<?php } ?>

		<!-- Выводим заголовок поста, как ссылку на сам пост. -->
		<h2><a href="<?php the_permalink() ?>" title="Ссылка на: <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>

		<!-- Выводим дату поста и ссылку на другие записи автора. -->
		<small><?php the_time('F jS, Y') ?> Автор: <?php the_author_posts_link() ?></small>

		<!-- Выводим текст поста в теге div. -->
		<div class="entry">
		   <?php the_content(); ?>
		</div>

		<!-- Выводим категории поста, через запятую. -->
		<p class="postmetadata">Расположено в <?php the_category(', '); ?></p>
		</div> <!-- закрываем основной тег div -->

		<!-- Отсюда цикл начинает повторятся, если есть еще посты -->
		<!-- Останавливаем цикл (endwhile), -->
	<?php endwhile; ?> 
	<!-- Полное окончание цикла. -->

<!-- Если записей в цикле нет, т.е. если цикл не сработал (else), выводим сообщение. -->
<?php else: ?>

	<p>Нет постов в цикле.</p>

<?php endif; ?>
39 комментов
Вопросы 1 Все
  • Эльдар cайт: Page%20cannot%20be%20displayed.%20Please...

    Цикл срабатывает только один раз.У меня три записи а он выводить только одну.Все написано без ошибок. В чем может быть проблема ?

    Ответить24 дня назад #
Здравствуйте, !     Войти . Зарегистрироваться