Как создать динамический список выборок в WordPress с помощью WP_Query

WP_Query — это мощный класс WordPress, который позволяет гибко получать записи из базы данных по заданным параметрам. Часто в темах и плагинах возникает задача вывести динамический список записей, например, последние записи определённой категории, посты с заданным метаполем или автором. В этой статье мы подробно разберём, как создавать такие списки, какие параметры можно использовать и приведём примеры кода для разных сценариев.

Основы работы с WP_Query: базовые параметры и структура

Для начала создадим базовый запрос, который получит последние 5 записей блога:

$args = array(
    'post_type' => 'post',
    'posts_per_page' => 5
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        echo '<h3>' . get_the_title() . '</h3>';
        echo '<p>' . get_the_excerpt() . '</p>';
    }
} else {
    echo 'Записей не найдено';
}
wp_reset_postdata();

Здесь мы передаём параметры в массиве $args, указывая тип записи (post_type) и количество записей (posts_per_page). В цикле выводим заголовок и отрывок.

Обязательно после цикла вызываем wp_reset_postdata(), чтобы вернуть глобальные переменные в исходное состояние и не сломать остальные части страницы.

Использование параметров таксономий и метаполей для фильтрации

WP_Query позволяет фильтровать по категориям, тегам и произвольным таксономиям с помощью параметров category_name, tag, tax_query. Также можно фильтровать по метаполям через meta_query.

Пример: вывести записи из категории «Новости» с пользовательским полем «featured» = 1

$args = array(
    'post_type' => 'post',
    'posts_per_page' => 10,
    'category_name' => 'novosti',
    'meta_query' => array(
        array(
            'key' => 'featured',
            'value' => '1',
            'compare' => '='
        )
    )
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        echo '<h3>' . get_the_title() . '</h3>';
        echo '<p>' . get_the_excerpt() . '</p>';
    }
} else {
    echo 'Записей не найдено';
}
wp_reset_postdata();

Такой запрос позволит выбрать только отмеченные записи с нужным полем featured.

Советы по построению сложных запросов с tax_query и meta_query

Для сложных условий можно использовать массивы с параметром relation для объединения условий:

$args = array(
    'post_type' => 'product',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => array('smartfony', 'planshety')
        ),
        array(
            'taxonomy' => 'product_tag',
            'field' => 'slug',
            'terms' => 'novinka'
        )
    ),
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'skidka',
            'value' => '10',
            'compare' => '>='
        ),
        array(
            'key' => 'nalichie',
            'value' => '1',
            'compare' => '='
        )
    )
);
$query = new WP_Query($args);

Такой запрос выберет товары из категорий «смартфоны» или «планшеты», которые имеют тег «новинка» и при этом либо скидку не меньше 10%, либо находятся в наличии.

Оптимизация WP_Query: уменьшение нагрузки и кэширование

Длинные и сложные запросы могут замедлять загрузку страницы, особенно на больших сайтах. Вот несколько рекомендаций:

  • Используйте параметры fields => 'ids', если нужно получить только ID записей, а потом вытаскивайте данные по необходимости.
  • Кешируйте результаты WP_Query с помощью Transients API, чтобы не выполнять тяжелый запрос при каждом заходе.
  • Избегайте использования posts_per_page => -1 без необходимости — это загрузит все записи.
  • Индексы по метаполям и таксономиям влияют на скорость выборки, подумайте об оптимизации базы данных.

Пример функции для повторного использования запроса с WP_Query на wpsnippets.ru

Создадим универсальную функцию с префиксом wpsnippets_, которая будет принимать параметры и выводить список записей:

function wpsnippets_get_post_list($args = array()) {
    $default_args = array(
        'post_type' => 'post',
        'posts_per_page' => 5
    );
    $query_args = array_merge($default_args, $args);
    $query = new WP_Query($query_args);
    if ($query->have_posts()) {
        echo '<ul class="wpsnippets-post-list">';
        while ($query->have_posts()) {
            $query->the_post();
            echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        }
        echo '</ul>';
    } else {
        echo '<p>Записей не найдено</p>';
    }
    wp_reset_postdata();
}

Пример вызова, чтобы вывести последние 3 записи из категории «tips»:

wpsnippets_get_post_list(array(
    'category_name' => 'tips',
    'posts_per_page' => 3
));

Плагины для продвинутой работы с WP_Query и списками

Для тех, кто предпочитает готовые решения, можно обратить внимание на следующие плагины:

  • ABC Pagination — расширенные варианты пагинации для списков записей.
  • WPRemark — удобное оформление комментариев и списков отзывов.
  • Quizle — создание интерактивных списков и опросов.

Эти плагины помогут быстро создать красивые и удобные списки с динамическими выборками без глубоких знаний кода.

Выводы и рекомендации

WP_Query даёт огромную гибкость для вывода любых выборок записей в WordPress. Главное — грамотно строить параметры запроса и помнить про оптимизацию. Используйте meta_query и tax_query для создания сложных фильтров, а также оборачивайте код в функции с префиксом, например, wpsnippets_, чтобы избежать конфликтов.

Если нужно более сложное взаимодействие с пользователем и динамическая подгрузка, стоит рассмотреть AJAX-запросы к REST API WordPress, что также можно реализовать с помощью WP_Query на сервере.

Как изменить метод AJAX обработки формы на REST API в WordPress
30.03.2026
Автоматическое удаление комментариев из черного списка по IP в WordPress
31.01.2026
Как добавить автоматическое удаление спама в комментариях WordPress
15.03.2026
Как добавить поддержку формата WebP в WordPress без плагинов
17.04.2026
WooCommerce: как исключить повторную отправку письма при изменении статуса заказа
03.05.2026