Цикл WordPress
К моменту загрузки шаблона WordPress уже разобрал адрес и получил из базы нужные записи: одну статью, список рубрики или результаты поиска. Шаблону остаётся их вывести. Для этого служит конструкция, которую называют просто «цикл».
Сам цикл
<?php
// index.php
if (have_posts()) :
while (have_posts()) :
the_post();
?>
<article>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
</article>
<?php
endwhile;
else :
?>
<p>Записей пока нет.</p>
<?php
endif;have_posts() проверяет, остались ли записи. the_post() делает следующую запись текущей — после этого функции вывода знают, с какой записью работать.
Функции вывода
| Функция | Что выводит |
|---|---|
the_title() | Заголовок |
the_content() | Полный текст |
the_excerpt() | Краткое описание |
the_permalink() | Адрес записи |
the_post_thumbnail('medium') | Картинку записи |
the_author() | Имя автора |
the_category(', ') | Рубрики со ссылками |
the_tags() | Метки |
the_ID() | Идентификатор |
Эти функции работают только внутри цикла.
the_ и get_the_
Функции с приставкой the_ сразу выводят значение. Парные функции get_the_ возвращают его — для проверок и своих преобразований:
<?php
// content.php
$title = get_the_title();
?>
<h2 class="<?php echo mb_strlen($title) > 60 ? 'title-long' : 'title'; ?>">
<?php echo esc_html($title); ?>
</h2>
<time datetime="<?php echo esc_attr(get_the_date('c')); ?>">
<?php echo esc_html(get_the_date('j F Y')); ?>
</time>Значения, полученные через get_, перед выводом экранируют функциями esc_html() и esc_attr().
Картинка записи
<?php
// content.php
if (has_post_thumbnail()) {
the_post_thumbnail('large', ['class' => 'cover', 'loading' => 'lazy']);
}Размеры thumbnail, medium, large и full WordPress создаёт при загрузке картинки. Свой размер добавляет add_image_size('card', 600, 400, true) в functions.php.
Одна запись
Шаблон отдельной статьи устроен так же — просто в цикле одна запись:
<?php
// single.php
get_header();
while (have_posts()) :
the_post();
?>
<article>
<h1><?php the_title(); ?></h1>
<div class="content"><?php the_content(); ?></div>
</article>
<?php
endwhile;
get_footer();Постраничный вывод
Сколько записей на странице, задано в «Настройки → Чтение». Ссылки на соседние страницы выводит одна функция:
<?php
// index.php
the_posts_pagination([
'prev_text' => '← Назад',
'next_text' => 'Вперёд →',
]);Частая ошибка
Без вызова the_post() цикл становится бесконечным: have_posts() всегда возвращает true, потому что текущая запись не меняется, и страница зависает. Строки while (have_posts()) и the_post() всегда идут вместе.