В WordPress часто возникает задача вывести список записей, отфильтрованных по нескольким таксономиям, при этом реализовав корректную пагинацию. Особенно это актуально для сайтов с большим объемом контента и сложной структурой фильтров. В этой статье мы подробно разберём, как правильно настроить пагинацию для комплексных WP_Query с несколькими таксономиями, чтобы избежать типичных ошибок и обеспечить удобство пользователям.
Почему стандартная пагинация не работает с несколькими таксономиями
Стандартный класс WP_Query отлично справляется с простыми запросами, однако при фильтрации по нескольким таксономиям возникают нюансы, которые влияют на пагинацию. Обычно они связаны с тем, что параметры запроса формируются неправильно, либо не учитывается параметр пагинации paged. Кроме того, если использовать параметр tax_query без точной настройки логических операторов, можно получить несоответствие количества страниц и записей.
Например, если фильтруете записи одновременно по категориям и меткам, то для корректной работы нужен правильный синтаксис tax_query с указанием оператора relation между условиями. Без этого пагинация сработает некорректно — либо будут повторяться страницы, либо записи не будут делиться на страницы должным образом.
Также важна правильная настройка параметра paged, который отвечает за номер текущей страницы. Если он не передан или передан неправильно, пагинация просто не сработает.
Настройка WP_Query для пагинации с несколькими таксономиями
Рассмотрим пример запроса, который фильтрует записи по двум таксономиям — категории и кастомной таксономии product_type. Для корректной пагинации нам нужно задать параметры tax_query с правильным отношением, а также передать текущий номер страницы из глобальной переменной $paged.
function wppagenavi_get_filtered_posts() {
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array('novosti', 'stati'),
'operator' => 'IN'
),
array(
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => array('software', 'hardware'),
'operator' => 'IN'
),
),
);
$query = new WP_Query($args);
return $query;
}
Обратите внимание на параметр relation в tax_query. Он задаёт логику объединения фильтров — AND означает, что записи должны соответствовать всем условиям, OR — хотя бы одному из них.
Вывод постов и навигация по страницам
После получения объекта WP_Query нужно вывести записи и отобразить навигацию. Для этого можно использовать стандартные функции WordPress или плагин WP-PageNavi, который значительно облегчает создание удобной пагинации.
Пример вывода записей и пагинации с использованием WP-PageNavi:
function wppagenavi_display_filtered_posts() {
$query = wppagenavi_get_filtered_posts();
if ($query->have_posts()) {
echo '<div class="posts-list">';
while ($query->have_posts()) {
$query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
echo '<div>' . get_the_excerpt() . '</div>';
}
echo '</div>';
if (function_exists('wp_pagenavi')) {
wp_pagenavi(array('query' => $query));
} else {
// Стандартная навигация
previous_posts_link('< Назад');
next_posts_link('Вперед >', $query->max_num_pages);
}
} else {
echo '<p>Посты не найдены.</p>';
}
wp_reset_postdata();
}
Для установки WP-PageNavi используйте репозиторий WordPress или скачайте с wpshop.ru.
Обработка параметров фильтрации из URL для динамической пагинации
Часто хочется сделать фильтрацию динамической, когда пользователь может выбирать таксономии через GET-параметры, а пагинация при этом корректно учитывает выбранные фильтры. Для этого необходимо получать параметры из URL и подставлять их в tax_query.
Пример получения параметров и формирования запроса:
function wppagenavi_get_filtered_posts_dynamic() {
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$categories = isset($_GET['category']) ? explode(',', sanitize_text_field($_GET['category'])) : array();
$product_types = isset($_GET['product_type']) ? explode(',', sanitize_text_field($_GET['product_type'])) : array();
$tax_query = array('relation' => 'AND');
if (!empty($categories)) {
$tax_query[] = array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $categories,
'operator' => 'IN'
);
}
if (!empty($product_types)) {
$tax_query[] = array(
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => $product_types,
'operator' => 'IN'
);
}
// Если нет фильтров, удаляем relation
if (count($tax_query) === 1) {
$tax_query = array();
}
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged,
);
if (!empty($tax_query)) {
$args['tax_query'] = $tax_query;
}
$query = new WP_Query($args);
return $query;
}
Такой подход позволяет гибко фильтровать записи и при этом пагинация будет работать корректно, учитывая все параметры фильтра.
Рекомендации для отладки и оптимизации пагинации с таксономиями
При работе с комплексными запросами и пагинацией важно следовать нескольким правилам:
- Всегда проверяйте параметр
paged— без него пагинация не сработает. - Используйте правильный синтаксис
tax_queryс указаниемrelation, чтобы фильтр работал как ожидается. - Не забывайте вызывать
wp_reset_postdata()после пользовательского запроса, чтобы не повредить глобальный $post. - Для сложных сценариев с динамическими фильтрами используйте проверку параметров из URL, фильтруйте их и формируйте
tax_queryдинамически. - При большом объёме данных рассмотрите использование плагинов кеширования или оптимизацию запросов, чтобы пагинация не тормозила сайт.
Использование плагина Clearfy Pro для оптимизации запросов
Плагин Clearfy Pro позволяет оптимизировать работу сайта, включая улучшение запросов к базе данных и кеширование, что положительно сказывается на скорости пагинации при комплексных запросах с таксономиями.
Заключение по теме пагинации с несколькими таксономиями
Пагинация для комплексных запросов с несколькими таксономиями в WordPress — задача, требующая точной настройки WP_Query, правильной обработки параметров и грамотного вывода навигации. Используя представленные примеры и рекомендации, вы сможете реализовать удобную и корректную пагинацию, улучшая пользовательский опыт на своём сайте.