Три способа сделать цикл 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мотрите другие статьи: