Три способа сделать цикл WordPress

В одной из прошлых статей "Функции цикла Wordpress" мы уже обсудили предназанчения так называемого Цикла WordPress. Цикл хоть и один, но существует три способа его создания:
  • Стандартный цикл, который запускает WordPress
  • Цикл на основе query_posts
  • Цикл на основе класса WP_Query
  • Цикл на основе get_posts
Эти две функции и один класс принимают один аргумент, с одинаковыми параметрами. И возвращают результат в одном и том же формате. Первый цикл запускается на каждой странице самим WordPress. Последние два являются пользовательскими и могут быть запрограммированы для различных нужд темы оформления. Давайте посмотрим на то, как работает каждый цикл и как его программируют.

Стандартный цикл WordPress

На каждой странице сайта запускается функция цикла WordPress, которая записывает результат выборки в глобальную переменную $wp_query. Цикл по данным в этой переменной выглядит так:
<?php
if ( have_posts() ){
   while ( have_posts() ){
      the_post();

      echo '<h2>' . get_the_title() . '</h2>'; // заголовок статьи
      echo get_the_excerpt(); // краткое содержание статьи
      next_posts_link(); // ссылка на следующую статью
      previous_posts_link(); // ссылка на предыдущую статью
   }
}else{
   echo '<p>Не найдено ни одной публикации...</p>';
}
Такой код можно найти в файле "index.php" в корневой папке темы. Подобные циклы отвечают за вывод выборки публикаций. Выборка создаётся по тем параметрам, которые выбирает сам WordPress при загрузке страницы, к примеру, из URL страницы.
WordPress сам определяет на какой странцие находится пользователь: список публикаций, категории, метки, архив или отдельная запись. Сам записывает результат в глобальную переменную $wp_query.

Цикл на основе query_posts

В цикле на основе "query_posts" данные тоже записываются в глобальную переменную $wp_query. Но первичные условия выборки можно задать самостоятельно. Перепишем предыдущий пример так, чтобы использовать "query_posts":
<?php
$filter = array(
   'category_name' => 'food', // фильтр по категории
   'posts_per_page' => 5, // ограничение количества результатов на странице
   'orderby' => 'comment_count' // сортировка по убыванию количества комментариев
);
query_posts( $filter );
if ( have_posts() ){
   while ( have_posts() ){
      the_post();

      echo '<h2>' . get_the_title() . '</h2>'; // заголовок статьи
      echo get_the_excerpt(); // краткое содержание статьи
      next_posts_link(); // ссылка на следующую статью
      previous_posts_link(); // ссылка на предыдущую статью
   }
}else{
   echo '<p>Не найдено ни одной публикации...</p>';
}
wp_reset_query();
С посощью "query_posts" делается запрос к базе данных с параметрами, которые можно задать самостоятельно. Но как говорили в статье "Функция query_posts в WordPress" нужно стараться избегать использования "query_posts". Именно потому что данные в глобальной переменной $wp_query будут обяательно перезаписываны при её вызове. А чтобы привести глобальные переменные к стандартным значениям приходится использовать функцию "wp_reset_query" после такого цикла с "query_posts".
В результате выполнения функции "query_posts" полученные данные будут записаны в переменную "$wp_query". Причём предыдущие данные в переменной "$wp_query" не стираются, а "перемешиваются" с новыми. Поэтому обязательно используйте "wp_reset_query".
Обычно функцию "query_posts" используют, когда нужно немного изменить данные базового запроса WordPress. Крайне нежелательно использовать "query_posts" несколько раз на странице.

Цикл на основе WP_Query

Циклы построенные на классе "WP_Query" ничем не отличаются от циклов на "query_posts". В этот класс передаются те же аргументы. Единственное отличие в том, что "WP_Query" не пишет результат в глобальную переменную "$wp_query". А создаётся новый объект $query.
<?php
$filter = array(
   'category_name' => 'food', // фильтр по категории
   'posts_per_page' => 5, // ограничение количества результатов на странице
   'orderby' => 'comment_count' // сортировка по убыванию количества комментариев
);
$query = new WP_Query( $filter );
if ( $query->have_posts() ){
   while ( $query->have_posts() ){
      $query->the_post();

      echo '<h2>' . get_the_title() . '</h2>'; // заголовок статьи
      echo get_the_excerpt(); // краткое содержание статьи
      next_posts_link(); // ссылка на следующую статью
      previous_posts_link(); // ссылка на предыдущую статью
   }
}else{
   echo '<p>Не найдено ни одной публикации...</p>';
}
wp_reset_postdata();
После выполнения цикла необходимо вызывать функцию "wp_reset_postdata", чтобы очисить глобальную переменную "$post". В этой переменной хранятся данные текущего запроса, а при вызове $query->the_post() в неё ещё записываются данные текущей выборки (последней публикации из неё). Вызов "wp_reset_postdata" очищает данные "$post", оставляя только донные запроса.
Функции "query_posts" и "get_posts" являются функциями-обёртками для класса "WP_Query". То есть обе функции при работе вызывают "WP_Query".

Цикл на основе get_posts

Цикл на функции "get_posts" похож на аналогичный с использованием "WP_Query":
<?php
$filter = array(
   'category_name' => 'food', // фильтр по категории
   'posts_per_page' => 5, // ограничение количества результатов на странице
   'orderby' => 'comment_count' // сортировка по убыванию количества комментариев
);
$query = get_posts( $filter );
if ( $query ){
   foreach( $query as $post ){
      setup_postdata( $post );

      echo '<h2>' . get_the_title() . '</h2>'; // заголовок статьи
      echo get_the_excerpt(); // краткое содержание статьи
      next_posts_link(); // ссылка на следующую статью
      previous_posts_link(); // ссылка на предыдущую статью
   }
}else{
   echo '<p>Не найдено ни одной публикации...</p>';
}
wp_reset_postdata();
Как можно заметить, при использовании "get_posts" необходимо вызывать функцию "setup_postdata", чтобы установить данные публикации. Сходство с классом "WP_Query" в том, что после цикла необходимо сбрасывать значения, используя функцию "wp_reset_postdata".
Функция "the_post" является функцией-обёрткой для функции "setup_postdata".

Какой цикл когда использовать?

Есть общие рекомендации для использования инструментов циклов:

query_posts() - используйте для изменения стандартного вывода записей на страницах WordPress. Используйте максиум 1 раз на странице.

get_posts() - используйте для любых запросов на странице. Можно использовать неограниченное число раз, но нужно вызывать "wp_reset_postdata".

WP_Query() - рекомендации аналогичны "get_posts".
MouseDC.ru - хостинг, виртуальный хостинг, покупка доменов, проверка доменов, WHOIS, курсы создания сайтов, вебинары по созданию, курсы разработки сайтов, доработка сайтов, сопровождение сайтов, разработка сайтов, техподдержка сайтов
Cмотрите другие статьи:
Была ли статья полезной?
Была ли эта статья полезна? Есть вопрос?
хостинг для сайтов
Закажите недорогой хостинг Заказать

всего от 290 руб