Три цикла WordPress (the loop)
Правильное использование нескольких циклов на странице даст возможность выводить блоки с нужными постами, сортировать их в нужном порядке и при этом не переживать о нарушении логической структуры страницы и «ловле» различных багов.
Возможные варианты построения циклов вывода постов:
- Стандартный цикл, изменяемый с помощью query_posts().
- Дополнительный цикл на основе WP_Query().
- Дополнительный цикл на основе get_posts().
Каждый из этих вариантов удобно использовать в разных ситуациях. Для использования каждого варианта не нужно изучать разный мануал, потому что все они работают с одинаковыми параметрами, нужно лишь понять как и где их использовать.
Стандартный цикл
Запускается на каждой странице самим WordPress. В нём не указываются данные для выборки постов, а цикл сразу начинается с if(have_posts()). Если пост присутствует, тело цикла выполняется до его окончания, а данные после обработки выводятся на экран.
// проверяем есть ли посты в глобальном запросе - переменная $wp_query
<?php if(have_posts()): ?>
// перебираем все имеющиеся посты и выводим их
<?php while(have_posts()): ?>
<?php the_post() ?>
// вывод постов
<?php endwhile ?>
<?php else: echo 'Записей нет' ?> // постов нет
<?php endif ?>Изменяем стандартный цикл с помощью query_posts
Используется чтобы изменить базовый запрос и вывести нужный вариант постов. Функция query_posts() не предназначена для создания нового цикла, а только для изменения стандартного цикла. Например, с помощью query_posts() можно вырезать отдельные категории, изменить порядок сортировки или убрать отдельные статьи.
Важно: при вызове query_posts() создаётся новый объект wp_query, который затем будет использоваться в цикле, поэтому функция должна располагаться перед стандартным циклом WordPress. При таком расположении WordPress перестаёт учитывать параметры поста, полученные из URL, и цикл выполняется с параметрами запроса query_posts().
<?php $args = [ ] ?> // указываем параметры запроса
<?php query_posts($args) ?>
// стандартный цикл WordPress
<?php if(have_posts()): ?>
<?php while(have_posts()): ?>
<?php the_post() ?>
// вывод постов
<?php endwhile ?>
<?php wp_reset_query() ?> // восстановливаем основой запрос
<?php else: echo 'Записей нет' ?> // постов нет
<?php endif ?> Цикл на основе WP_Query
Используется для вывода постов, не связанных с текущей страницей, или для создания множественных циклов. Особенность циклов на основе WP_Query() — создание нового объекта $query, который не связан с аналогичным глобальным объектом $wp_query, поэтому не нарушает структуру текущей страницы. После окончания цикла вызывается wp_reset_postdata() для восстановления оригинальных данных поста. Используется:
- если нужно вывести посты, не затрагивая основной цикл (допустим посты в боковой панели).
- если нужно создать множественные запросы.
- если нужно знать, сколько всего постов удовлетворяют условиям выборки (для этого в SQL запрос добавляется флаг
SQL_CALC_FOUND_ROWS— это создает дополнительную нагрузку на запрос). Так циклы WP_Query() дополнительно нагружают запрос, потому чаще нам будут подходить циклы с помощью get_posts().
<?php $args = [ ] ?> // указываем параметры запроса
<?php $query = new WP_Query($args) ?> // создаем новый объект WP_Query
<?php if($query->have_posts()): ?>
<?php while($query->have_posts()): ?>
<?php $query->the_post() ?>
// вывод постов
<?php endwhile ?>
<?php wp_reset_postdata() ?> // сбрасываем переменную $post
<?php else: echo 'Записей нет' ?> // постов нет
<?php endif ?> Цикл на основе get_posts()
Самый удобный вариант выводить нужные посты в нужном порядке — это выводить их с помощью get_posts(). Используется:
- всегда, когда нужно просто вывести посты из БД в любом месте шаблона.
- когда нужно создать несколько циклов.
- когда не нужно знать, сколько всего записей подходят под выборку.
- так как get_posts() принимает те же параметры, что и query_posts(), её очень удобно использовать для вывода записей по самым разным критериям.
<?php global $post ?> // не обязательно
<?php $args = [ ] ?> // указываем параметры запроса
<?php $myposts = get_posts($args) ?>
<?php foreach($myposts as $post): ?>
<?php setup_postdata($post) ?>
// вывод записей
<?php endforeach ?>
<?php wp_reset_postdata() ?> // сбрасываем переменную $postВыводы
Где и какой из 3-х вариантов циклов использовать:
- query_posts() — если нужно изменить/подправить стандартный вывод постов на страницах WordPress. Можно использовать 1 раз на странице.
- get_posts() — если нужно вывести посты из БД. Можно использовать сколько угодно раз на странице.
- WP_Query() — во всех других случаях когда не подошли query_posts() и get_posts(). Класс WP_Query() является ядром query_posts() и get_posts() и может быть использован для каких-либо сложных случаев вывода.
коментарии