WordPress. Класс WP_Query
26.04.2019
Теги: CMS • Web-разработка • WordPress • Запрос
Класс WP_Query
предназначен для выборки записей из базы данных по заданным условиям. На основе WP_Query
работают функции get_posts()
и query_posts()
и все остальные запросы, связанные с выбором записей из таблицы базы данных wp_posts
.
Функция get_posts()
Получает записи (посты, страницы, вложения) из базы данных по указанным критериям. Можно выбрать любые посты и отсортировать их как угодно. Это обертка класса WP_Query
, т.е. функция понимает все параметры WP_Query
.
У функции есть предустановленные параметры. Их иногда нужно изменить, чтобы они не мешали получить нужный результат:
post_type = post
— по умолчанию выбираются записи типаpost
numberposts = 5
— по умолчанию выбираются пять записейsuppress_filters = true
— параметр отключает работу некоторых фильтров (хуков)
Функция get_posts()
— это аналог query_posts()
. Отличается тем, что создает отдельный экземпляр класса WP_Query
, не вмешиваясь в глобальный запрос.
Параметры по умолчанию:
// параметры по умолчанию $posts = get_posts([ 'numberposts' => 5, 'category' => 0, 'orderby' => 'date', 'order' => 'DESC', 'include' => array(), 'exclude' => array(), 'meta_key' => '', 'meta_value' =>'', 'post_type' => 'post', 'suppress_filters' => true, ]);
Пример использования функции:
<?php global $post; $lastposts = get_posts([ 'posts_per_page' => 3 ]); ?> <?php foreach ($lastposts as $item): ?> <?php // Функция setup_postdata() заполняет глобальные переменные, которые нужны // для корректной работы the_permalink(), the_title(), the_excerpt(). Ф-ция // ожидает, что передаваемая переменная будет глобальным объектом $post. $post = $item; setup_postdata($post); ?> <h2> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </h2> <p><?php the_excerpt(); ?></p> <?php endforeach; ?> <?php wp_reset_postdata(); ?>
То же самое с использованием класса WP_Query
:
<?php $query = new WP_Query([ 'posts_per_page' => 3 ]); ?> <?php while ($query->have_posts()): ?> <?php $query->the_post(); ?> <h2> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </h2> <p><?php the_excerpt(); ?></p> <?php endwhile; ?> <?php wp_reset_postdata(); ?>
wp_reset_postdata()
возвращает глобальную переменную $post
в правильное состояние, в соответствие с текущим основным запросом. Функцию нужно использовать каждый раз после запуска произвольного цикла. Т.е. в случаях, когда на странице есть дополнительный цикл WordPress с использованием глобальной переменной $post
.
Функция query_posts()
Используется самим WordPress для получении записей текущей страницы (отдельная запись, рубрика, метка). Определяет, какие посты будут показаны в базовом Цикле WordPress. Создает базовый Цикл WordPress и возвращает список записей (постов).
Использовать query_posts()
может быть опасно, она предназначена для самого WordPress и должна использоваться только для изменения основного Цикла WordPress. Для создания еще одного цикла предназначена функция get_posts()
.
Основной запрос WordPress — это запрос, который выполняется до вывода какого-либо текста на страницу. Параметры такого запроса собирает сам WordPress — записи какой рубрики показывать, сколько записей будет на странице и т.п. А вторичный запрос — это тот, который создается темой или плагином и выполняется дополнительно к основному. Например: вывод в сайдбаре списка рубрик или списка популярных записей.
Если использовать query_posts()
для создания вторичных запросов (циклов), то могут появится ошибки, из-за которых будет рушится структура и тип страниц, так как повторный вызов query_posts()
переписывает базовый запрос WordPress, на основе которого определяется тип текущей страницы (запись, рубрика), определяется сколько записей показывать на странице (пагинация) и многое другое.
Разница между query_posts()
и get_posts()
в том, что query_posts()
создает новый WP_Query
объект и связывает его с глобальной переменной $wp_query
. Тогда как get_posts()
или WP_Query()
просто создают новый WP_Query
объект, без изменения каких-либо глобальных данных.
Если по каким-то причинам есть необходимость использовать query_posts()
, то после цикла обязательно нужно вызвать wp_reset_query()
, которая сбрасывает глобальные переменные запроса на начальные.
Класс WP_Query
Позволяет получать посты из базы данных по самым разным критериям. Простой пример использования:
$query = new WP_Query([ 'posts_per_page' => 10, 'orderby' => 'comment_count' ]); if ($query->have_posts()) { echo '<ul>'; while ($query->have_posts()) { $query->the_post(); echo '<li>' . get_the_title() . '</li>'; } echo '</ul>'; wp_reset_postdata(); } else { echo '<p>Записей не найдено</p>'; }
Параметры категорий (рубрик)
Получает посты относящиеся к определенным категориям.
cat
(число/строка/массив). Идентификатор категории.category_name
(строка). Имя (slug) категории.category__and
(массив). Записи, которые входят одновременно в несколько категорий.category__in
(массив). Записи, которые входят в одну из указанных категорий.category__not_in
(массив). Записи, которые не входят в указанные категории.
// записи из категории с идентификатором 4; записи // из дочерних категорий также будут выбраны $query = new WP_Query(['cat' => 4]);
// записи из категорий с указанными идентификаторами; // записи из дочерних категорий также будут выбраны $query = new WP_Query(['cat' => [2,6,17,38]);
// записи из категории python $query = new WP_Query(['category_name' => 'python']);
// записи из категорий python и javascript $query = new WP_Query(['category_name' => 'python,javascript']);
// записи из категории с идентификатором 4 $query = new WP_Query(['category__in' => [4]]);
// записи из категорий с указанными идентификаторами $query = new WP_Query(['category__in' => [2,6]]);
// записи, которые входят одновременно в категории 2 и 6 $query = new WP_Query(['category__and' => [2,6]]);
Параметры меток (тегов)
Получает посты относящиеся к определенным меткам.
tag
(строка). Название (slug) метки.tag_id
(число). Идентификатор метки.tag__and
(массив). Записи одновременно из нескольких меток. Массив идентификаторов.tag__in
(массив). Записи хотя бы с одной указанной меткой. Массив идентификаторов.tag__not_in
(массив). Записи, не относящиеся к указанным меткам. Массив идентификаторов.tag_slug__and
(массив). Аналогичноtag__and
, только указываются названия (slug) меток.tag_slug__in
(массив). Аналогичноtag__in
, только указываются названия (slug) меток.
// записи с меткой flowers $query = new WP_Query(['tag' => 'flowers']);
// записи, имеющие обе указанные метки $query = new WP_Query(['tag__and' => [37,47]]);
// записи, имеющие хотя бы одну из указанных меток $query = new WP_Query(['tag__in' => [37,47]));
// записи, не связанные с метками 37 или 47 $query = new WP_Query(['tag__not_in' => [37,47]]);
Дополнительно
Поиск: CMS • Web-разработка • WordPress • Запрос • Класс • WP_Query