Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Цикл 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() всегда идут вместе.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.