- Стандартный цикл, который запускает WordPress
- Цикл на основе query_posts
- Цикл на основе класса WP_Query
- Цикл на основе get_posts
Стандартный цикл 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".