Цикл WordPress

12.03.2019

Теги: CMSWeb-разработкаWordPressБазаДанныхФункцияЦикл

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

Когда говорят «Функция используется внутри Цикла WordPress» — это значит, что функцию можно использовать внутри цикла, при этом нет необходимости передавать ей параметры (указывать ей, с какой записью работать).

Например, the_title() вызывается без параметров, но при этом функция будет выводить заголовок текущей записи в цикле. Такие функции (работающие с Циклом), работают с глобальной переменной $post. Из этой переменной они берут данные для вывода.

<?php if (have_posts()): ?>
    <?php while (have_posts()): ?>
        <?php
        /*
         * Это обёртка для функции setup_postdata(). Функция получает следующий пост, переопределяет
         * глобальную переменную $post и устанавливает свойство $in_the_loop класса WP_Query в true.
         * Переменная $post нужна, чтобы работали теги шаблона the_title(), the_date(), the_content().
         */
        the_post();
        ?>
        <h2><?php the_title(); ?></h2>
        <small><?php the_date(); ?></small>
        <div class="excerpt">
            <?php the_excerpt(); ?>
        </div>
    <?php endwhile; ?>
<?php else : ?>
    <p>Записей нет.</p>
<?php endif; ?>

Обратите внимание — в стандартном Цикле мы не указываем никаких данных для выборки записей, а сразу начинаем цикл. Это говорит о том, что данные уже существуют и их нужно просто обработать и вывести на экран.

«Уже существующие» данные для каждого типа страниц создаются автоматически и сохраняются в глобальную переменную $wp_query. WordPress заранее делает запрос к БД, на основе того, какой тип страницы сейчас отображается — категория, статья, страница. И результат этого запроса записывает в $wp_query, а затем оттуда их можно вывести в цикле.

Но, мы можем и самостоятельно получить данные и затем вывести их в цикле:

<?php
$posts = get_posts([
    'numberposts'      => 10, // выбираем 10 записей рубрики
    'category_name'    => 'doma-iz-brusa',
    'orderby'          => 'date',
    'order'            => 'DESC',
    'post_type'        => 'post'
]);
?>

<?php foreach ($posts as $post): ?>
    <?php
    /*
     * Функция устанавливает глобальные данные поста, которые нужны для использования
     * функций the_title(), the_date(), the_content() и т.д.
     */
    setup_postdata($post);
    ?>
    <h2><?php the_title(); ?></h2>
    <small><?php the_date(); ?></small>
    <div class="excerpt">
        <?php the_excerpt(); ?>
    </div>
<?php endforeach; ?>

<?php
/*
 * Всегда, когда используется функция setup_postdata(), после цикла нужно сбрасывать
 * запрос с помощью функции wp_reset_postdata()
 */
wp_reset_postdata();
?>
<?php
// задаем нужные нам условия выборки данных из БД
$query = new WP_Query([
    'post_type' => 'post',
    'posts_per_page' => 10, // 10 постов на страницу
    'orderby' => 'date', // сортировка по дате
    'order' => 'DESC' // сортировка по убыванию
]);
?>

<?php if ($query->have_posts()): ?>
    <?php while ($query->have_posts()): ?>
        <?php $query->the_post(); ?>
        <h2><?php the_title(); ?></h2>
        <small><?php the_date(); ?></small>
        <div class="excerpt">
            <?php the_excerpt(); ?>
        </div>
    <?php endwhile; ?>
<?php else: ?>
    <p>Записей нет.</p>
<?php endif; ?>

<?php
// сбрасываем $post, возвращаем оригинальные данные
wp_reset_postdata();
?>

Поиск: CMS • Web-разработка • WordPress • База данных • Функция • Цикл • The Loop • have_posts • the_post • the_title • the_date • the_excerpt • the_content • get_posts • setup_postdata • wp_reset_postdata • WP_Query

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.