WordPress. Класс WP_Query

26.04.2019

Теги: CMSWeb-разработка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

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.