Что такое Цикл WordPress — The Loop
Начну с того, что говорить «цикл loop» — это неправильно. Это тоже самое, что сказать, - «цикл цикл», т.е. loop = цикл = повторяющееся действие. Правильно говорить просто «Цикл WordPress». Далее в тексте «Цикл WordPress» — тоже самое, что «loop», «the loop» или «цикл the loop WordPress».
Цикл WordPress (The Loop) — это перебор записей (постов) и вывод какой-либо информации о каждом посте. Цикл получает массив записей (объектов), перебирает этот массив и во время перебора выводит информацию о каждом посте. При этом в цикле используются специально созданные для него функции: the_title(), the_permalink(), the_date() и т.д.
Когда говорится «Функция используется внутри Цикла WordPress» — это значит, что функцию можно использовать внутри цикла, при этом нет необходимости передавать ей параметры, потому что функция рассчитана на использование внутри цикла.
Например, the_title() вызывается без параметров, но при этом функция будет выводить заголовок ткущей записи в цикле. Данные для вывода берутся из глобальной переменной $post.
Цикл в WordPress выглядит так:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <!-- Цикл WordPress --> <p>Выводим данные записи. Здесь работают функции для цикла, например, the_title() </p> <h2><?php the_title() ?></h2> <?php endwhile; else : ?> <p>Записей нет.</p> <?php endif; ?>
Или можно записать так:
<?php if ( have_posts() ) { while ( have_posts() ) { the_post(); ?>
<!-- Цикл WordPress -->
<!-- Вывод постов: the_title() и т.д. -->
<?php } } else { ?>
<p>Записей нет.</p>
<?php } ?>
Еще можно записать так (часть «Записей нет» в этом случае можно удалить):
<?php while ( have_posts() ){ the_post(); ?>
<!-- Цикл WordPress -->
<!-- Вывод постов: the_title() и т.д. -->
<?php } ?>
<?php if ( ! have_posts() ){ ?>
<p>Записей нет.</p>
<?php } ?>
Вся информация о записи (посте) хранится в глобальной переменной $post. Предположим, что цикл обрабатывает массив содержащий в себе данные 10 постов, тогда у цикла будет 10 повторений и переменная $post будет меняться 10 раз, и при каждом повторении с переменной $post будет считываться информация о посте и выводится на экран, через теги шаблона: the_title(), the_content()... Таким образом, любой PHP/HTML код помещенный в цикл WordPress будет повторятся пока работает цикл: 10 итераций цикла - 10 повторений.
Типичный пример Цикла — это вывод постов на странице категорий, меток, на главной странице WordPress.
Полный пример цикла
Приведу пример цикла WordPress, со встроенными в код комментариями (внутри <!-- -->)
<!-- Проверка наличия записей в цикле -->
<?php if ( have_posts() ) : ?>
<!-- Начало цикла -->
<?php while ( have_posts() ) : the_post(); ?>
<!-- Цикл WordPress -->
<!-- Здесь уже определилась переменная $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; ?>
Другие варианты цикла
Примеры цикла выше, где используется have_posts(), получают данные для перебора из глобальной переменной $wp_query в которую WP автоматически добавляет данные в соответствии с тем, на какой странице мы сейчас находимся, например, на главной странице или странице рубрик, данные будут разные.
Но, получить данные и затем их обработать в цикле мы можем самостоятельно.
Читайте подробнее: 3 способа построения циклов в WordPress
Цикл с использованием get_posts():
<?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();
?>
Цикл с использованием wp_query():
// задаем нужные нам критерии выборки данных из БД
$query = new WP_Query( [
'posts_per_page' => 5,
'orderby' => 'comment_count'
] );
// Цикл
global $post;
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
<?php the_title() ?>
}
} else {
// Постов не найдено
}
wp_reset_postdata(); // Сбрасываем $post. Возвращаем оригинальные данные
Зачем нужно понимать внутри Цикла мы или нет?
Отличать где используется Цикл WordPress, а где код находится за пределами цикла нужно, потому что в WordPress есть определенные теги шаблона, которые не работают за пределами цикла, например: the_title(), the_content(), the_excerpt() и т.д. Для того, чтобы каждая такой тег шаблона сработал, должна быть определена переменная $post, которая за пределами цикла WordPress неизвестна (точнее не корректна, если цикл запускался, то $post известна — она содержит данные последнего, обработанного в цикле поста, но это уже другая тема).