В WordPress часто возникает задача сделать пагинацию для сложных запросов, которые включают фильтрацию по мета-полям и таксономиям. Стандартные функции пагинации работают с простыми запросами, но когда речь идет о комплексных WP_Query с meta_query и tax_query, нужно учитывать ряд нюансов, чтобы пагинация работала корректно и была SEO-дружелюбной.
Понимание особенностей пагинации в комплексных WP_Query
Когда вы создаете запрос с использованием meta_query и tax_query, WordPress формирует SQL-запросы с JOIN и WHERE, что влияет на подсчет общего количества записей. Для правильной работы пагинации важно, чтобы в объекте WP_Query корректно определялось свойство found_posts, а параметр no_found_rows не был установлен в true.
Если использовать no_found_rows => true для оптимизации, пагинация работать не будет, так как WordPress не делает подсчет общего количества записей. Для пагинации его обязательно нужно отключить.
Также стоит помнить, что при использовании сложных запросов пагинация должна учитывать передаваемые параметры, чтобы ссылки на страницы корректно отображали фильтры.
Пример создания комплексного запроса с пагинацией
Рассмотрим пример, где мы выводим посты типа product, фильтруя их по мета-полю price и таксономии product_cat, и реализуем пагинацию.
function wppagenavi_custom_pagination_query() {
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
'paged' => $paged,
'meta_query' => array(
array(
'key' => 'price',
'value' => array(1000, 5000),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
),
),
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'smartphones'
),
),
'no_found_rows' => false // обязательно для пагинации
);
$query = new WP_Query($args);
if ( $query->have_posts() ) {
echo '<ul class="products">';
while ( $query->have_posts() ) {
$query->the_post();
echo '<li>' . get_the_title() . '</li>';
}
echo '</ul>';
// Вывод пагинации
wppagenavi_pagination_links($query);
}
wp_reset_postdata();
}Функция вывода пагинации для кастомного WP_Query
Создаем функцию для вывода пагинации, которая принимает объект запроса и корректно формирует ссылки.
function wppagenavi_pagination_links($query) {
$big = 999999999; // уникальное число для замены
$pagination = paginate_links(array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => max(1, get_query_var('paged')),
'total' => $query->max_num_pages,
'prev_text' => '« Назад',
'next_text' => 'Вперед »',
'type' => 'list'
));
if ( $pagination ) {
echo '<nav class="pagination">' . $pagination . '</nav>';
}
}Как сохранить параметры фильтрации в ссылках пагинации
Если фильтры (например, диапазон цены или категории) передаются через GET-параметры, то при построении ссылок пагинации важно добавлять их к URL, чтобы при переходе на следующую страницу фильтрация сохранялась.
Для этого можно воспользоваться фильтром paginate_links или вручную добавить параметры в базу ссылки.
Пример добавления GET-параметров в ссылки пагинации:
function wppagenavi_pagination_links($query) {
$big = 999999999;
$current_page = max(1, get_query_var('paged'));
// Получаем текущие параметры GET
$query_args = array();
if ( !empty($_GET['price_min']) ) {
$query_args['price_min'] = sanitize_text_field($_GET['price_min']);
}
if ( !empty($_GET['price_max']) ) {
$query_args['price_max'] = sanitize_text_field($_GET['price_max']);
}
if ( !empty($_GET['category']) ) {
$query_args['category'] = sanitize_text_field($_GET['category']);
}
$pagination = paginate_links(array(
'base' => add_query_arg($query_args, str_replace($big, '%#%', esc_url(get_pagenum_link($big)))),
'format' => '?paged=%#%',
'current' => $current_page,
'total' => $query->max_num_pages,
'prev_text' => '« Назад',
'next_text' => 'Вперед »',
'type' => 'list'
));
if ( $pagination ) {
echo '<nav class="pagination">' . $pagination . '</nav>';
}
}Использование плагина ABC Pagination для сложных запросов
Для упрощения работы с пагинацией в сложных случаях можно использовать плагин ABC Pagination. Он позволяет легко кастомизировать отображение пагинации и корректно работать с WP_Query, включая фильтрацию по мета-полям и таксономиям.
Плагин предлагает удобные хуки и шаблоны для вывода, а также поддержку AJAX, что позволяет сделать пагинацию более отзывчивой и быстрой.
Подключение и использование ABC Pagination:
- Установите плагин через админку WordPress или скачайте с сайта WPSHOP.RU.
- Используйте функцию
abc_pagination()вместо стандартногоpaginate_links(). - Настройте вывод через параметры функции для учета текущих фильтров и запросов.
Советы по оптимизации и SEO пагинации для сложных запросов
1. Используйте параметр no_found_rows => false для корректного подсчета страниц.
2. Кешируйте результаты запросов при большом количестве данных, чтобы снизить нагрузку на базу.
3. Обязательно добавляйте параметры фильтрации в URL пагинации, чтобы избежать дублирования контента и сохранить пользовательский контекст.
4. Добавляйте мета-теги rel="next" и rel="prev" в заголовок страницы для улучшения SEO.
5. Проверяйте корректность работы пагинации при AJAX-загрузках, если используете динамическую подгрузку контента.
Реализуя пагинацию для комплексных запросов с мета-записями и таксономиями, вы значительно улучшаете удобство навигации по сайту и повышаете релевантность выдачи для пользователей. Внимательное отношение к деталям поможет избежать распространенных ошибок и сделать интерфейс более профессиональным.