Цикл (Loop) в WordPress
Цикл в WordPress — это процесс обработки постов (публикаций) по одному, который выводит информацию о каждом посте. Цикл получает массив объектов (постов), проходит по этому массиву и отображает информацию о каждом посте. Для этого используются специальные функции, например: the_title()
, the_permalink()
, the_date()
и другие.
Когда говорят "Функция должна находиться внутри Цикла", это означает, что функция должна использоваться внутри Цикла, не передавая ей параметры, так как она предназначена для работы именно в этом контексте.
Например, the_title()
вызывается без параметров, но она выведет заголовок текущего поста, когда используется внутри Цикла. Данные для вывода берутся из глобальной переменной $post
.
Большинство функций шаблонов (Template Tags) предназначены для использования внутри Цикла.
Содержание
- Использование Цикла
- Примеры Цикла
- Полный пример Цикла
- Другие варианты Цикла
- Почему важно понимать, находимся ли мы внутри Цикла или нет?
- Вложенные Циклы
Использование Цикла
Цикл следует разместить в файле index.php
темы и в любом другом шаблоне, который используется для отображения информации о постах, например, в category.php
или archive.php
.
Стандартный Цикл
Стандартный Цикл начинается с такого кода:
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
Или его можно записать так:
<?php
// Проверяем, есть ли посты на текущей странице
if ( have_posts() ) {
// Начинаем цикл
while ( have_posts() ) {
the_post();
// Контент поста здесь
}
}
?>
Примеры Цикла
Цикл в WordPress может выглядеть так:
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
Вывод данных поста. Функции для цикла работают здесь, например, the_title()
Нет постов.
Или его можно записать так:
<?php if ( have_posts() ) { while ( have_posts() ) { the_post(); ?>
<?php } } else { ?>
Нет постов.
<?php } ?>
Также можно записать и таким образом (в этом случае часть "Нет постов" можно удалить):
<?php while ( have_posts() ){ the_post(); ?>
<?php } ?>
<?php if ( ! have_posts() ){ ?>
Нет постов.
<?php } ?>
Вся информация о посте хранится в глобальной переменной $post
. Если цикл обрабатывает массив из 10 постов, то он пройдет 10 итераций, и переменная $post
будет изменяться 10 раз, а на каждой итерации из $post
будет извлекаться информация о посте и отображаться с помощью тегов шаблона: the_title()
, the_content()
. Таким образом, любой PHP/HTML код, который помещен в Цикл WordPress, будет повторяться столько раз, сколько итераций в Цикле: 10 итераций — 10 повторений.
Типичным примером Цикла является вывод постов на странице категории, на странице тегов, на главной странице.
Полный пример Цикла
Вот пример Цикла WordPress с комментариями, встроенными в код:
<?php if ( have_posts() ) : ?>
<?php else: ?>
Нет постов в цикле.
<?php endif; ?>
Другие варианты Цикла
Примеры Цикла, где используется have_posts()
, получают данные из глобальной переменной $wp_query
, куда WP автоматически добавляет данные в соответствии с текущей страницей, на которой мы находимся. Например, на главной странице и на странице категории данные будут различаться.
Однако мы можем получить данные и обработать их в Цикле самостоятельно.
Цикл с использованием get_posts()
<?php
global $post;
$myposts = get_posts( 'numberposts=5&offset=1&category=1' );
foreach( $myposts as $post ){
setup_postdata( $post );
?>
}
wp_reset_postdata();
?>
Цикл с использованием wp_query()
<?php
// Задаем критерии для выбора данных из базы данных
$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 {
// Посты не найдены
}
// Сбрасываем глобальную переменную $post. Возвращаем оригинальные данные
wp_reset_postdata();
?>
Почему важно понимать, находимся ли мы внутри Цикла или нет?
Различать, где используется Цикл WordPress, а где код находится вне Цикла, необходимо, потому что WordPress имеет определённые теги шаблона, которые не работают вне Цикла, такие как the_title()
, the_content()
, the_excerpt()
и др. Для того чтобы каждый из таких тегов шаблона работал, должна быть определена глобальная переменная $post
, которая неизвестна вне Цикла WordPress (или переменная $post
может быть известна вне Цикла, но она может содержать некорректные данные).
Вложенные Циклы
Вложенные циклы означают, что вы запускаете второй цикл перед завершением первого. Это может быть полезно для отображения постов той категории, к которой принадлежит пост в основном цикле:
if ( have_posts() ) {
// Начинаем основной цикл
while ( have_posts() ) {
the_post();
// Вложенный цикл
$my_query = new WP_Query( 'cat=3' );
if ( $my_query->have_posts() ) {
while ( $my_query->have_posts() ) {
$my_query->the_post();
the_content();
}
}
wp_reset_postdata();
}
}
Теперь у вас есть полное представление о том, как работает Цикл в WordPress. Вы можете использовать эти знания для создания и настройки своих тем и шаблонов постов.