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 на сервере.