yandex

Веб-разработка

Статьи о разработке сайтов

Веб-разработка

Три цикла WordPress (the loop)

6290
0
Веб-разработка

Правильное использование нескольких циклов на странице даст возможность выводить блоки с нужными постами, сортировать их в нужном порядке и при этом не переживать о нарушении логической структуры страницы и «ловле» различных багов.

Возможные варианты построения циклов вывода постов:

  1. Стандартный цикл, изменяемый с помощью query_posts().
  2. Дополнительный цикл на основе WP_Query().
  3. Дополнительный цикл на основе 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() и может быть использован для каких-либо сложных случаев вывода.
коментарии
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Курс по созданию темы WordPress

купить