Пагинация — одна из важнейших составляющих удобной навигации на сайте. В WordPress стандартный способ разбивки на страницы обычно простой: предыдущая, следующая, и номера страниц. Но что делать, если нужно реализовать многоуровневую пагинацию, например, для сложных архивов или большого каталога записей с разбиением по категориям и подкатегориям? В этой статье мы подробно разберём, как в WordPress создать многоуровневую пагинацию с кастомным выводом и примерами кода.
Почему стандартная пагинация WordPress не всегда подходит
По умолчанию WordPress использует функции paginate_links() и the_posts_pagination() для вывода страниц. Это хорошо для простых случаев, но если вы хотите создать более сложную навигацию, например, показывать пагинацию внутри разных таксономий, с дополнительными уровнями вложенности или с кастомным количеством страниц в блоке, то стандартных функций может не хватить.
Пример: если у вас есть каталог товаров или записей, разбитых по категориям и подкатегориям, и вы хотите выводить навигацию сначала по категориям, а внутри них — постраничную навигацию для записей, потребуется кастомное решение.
В таких случаях помогает создание собственной функции пагинации, которая учитывает контекст и умеет работать с несколькими уровнями.
Основы создания многоуровневой пагинации в WordPress
В основе лежит работа с объектом WP_Query или глобальным $wp_query, а также с параметрами пагинации — paged и max_num_pages. Чтобы реализовать многоуровневую пагинацию, нужно:
- Определить текущий уровень пагинации (например, категория, подкатегория, страница в категории).
- Собрать URL с правильными параметрами для каждого уровня.
- Вывести навигацию с помощью кастомного HTML, учитывая все уровни.
Далее приведём пример функции wpset_get_multilevel_pagination(), которая строит многоуровневую пагинацию.
Пример функции многоуровневой пагинации
function wpset_get_multilevel_pagination($query, $base_url) {
$total_pages = $query->max_num_pages;
$current_page = max(1, get_query_var('paged'));
if ($total_pages <= 1) return '';
$pagination = '<nav class="wpset-pagination"><ul>';
// Добавим кнопку «Предыдущая»
if ($current_page > 1) {
$prev_page = $current_page - 1;
$pagination .= '<li><a href="' . esc_url(add_query_arg('paged', $prev_page, $base_url)) . '">‹ Предыдущая</a></li>';
}
// Добавим номера страниц с учётом многоуровневости
for ($i = 1; $i <= $total_pages; $i++) {
$class = ($i == $current_page) ? ' class="active"' : '';
$pagination .= '<li' . $class . '><a href="' . esc_url(add_query_arg('paged', $i, $base_url)) . '">' . $i . '</a></li>';
}
// Добавим кнопку «Следующая»
if ($current_page < $total_pages) {
$next_page = $current_page + 1;
$pagination .= '<li><a href="' . esc_url(add_query_arg('paged', $next_page, $base_url)) . '">Следующая ›</a></li>';
}
$pagination .= '</ul></nav>';
return $pagination;
}Эта функция принимает объект WP_Query и базовый URL (например, адрес категории) и создаёт навигацию с кнопками «Предыдущая», «Следующая» и номерами страниц. Для многоуровневой пагинации нужно правильно формировать $base_url с учётом уровней категорий или других параметров.
Как интегрировать многоуровневую пагинацию с категориями и подкатегориями
Чтобы пагинация работала корректно при навигации по категориям и подкатегориям, нужно:
- Получать текущий термин таксономии и его родителей.
- Формировать базовый URL с учетом иерархии.
- Передавать этот URL в функцию пагинации.
Пример получения базового URL для категории и подкатегорий:
function wpset_get_category_base_url($term_id, $taxonomy = 'category') {
$term = get_term($term_id, $taxonomy);
if (!$term || is_wp_error($term)) return home_url('/');
$parents = get_ancestors($term_id, $taxonomy);
$parents = array_reverse($parents);
$url_parts = [];
foreach ($parents as $parent_id) {
$parent = get_term($parent_id, $taxonomy);
if ($parent && !is_wp_error($parent)) {
$url_parts[] = $parent->slug;
}
}
$url_parts[] = $term->slug;
return home_url('/' . implode('/', $url_parts) . '/');
}Используя эту функцию, можно получить правильный URL с учётом вложенности категории, который затем передать в wpset_get_multilevel_pagination().
Реализация многоуровневой пагинации для кастомных типов записей и таксономий
Для кастомных типов записей и таксономий задача усложняется из-за нестандартных правил URL. В таких случаях рекомендуется:
- Использовать WP_Rewrite для правильной генерации URL.
- Передавать параметры запроса через
add_query_arg()или настраиватьrewriteдля таксономий. - Для пагинации применять параметр
pagedв WP_Query.
Пример создания запроса с пагинацией для пользовательского типа записей:
$paged = max(1, get_query_var('paged'));
$args = [
'post_type' => 'product',
'posts_per_page' => 10,
'paged' => $paged,
];
$query = new WP_Query($args);После этого можно вызвать функцию пагинации, передав $query и базовый URL текущей таксономии.
Пример использования с плагином ABC Pagination
Если хотите упростить создание пагинации, можно использовать плагин ABC Pagination. Он поддерживает кастомные шаблоны и может быть настроен для многоуровневой пагинации с использованием фильтров и хуков.
Оптимизация и UX многоуровневой пагинации
При реализации многоуровневой пагинации важно учитывать удобство пользователя и производительность:
- Показывайте ограниченное количество номеров страниц, например, 5–7, с кнопками перехода к первому и последнему.
- Используйте AJAX-подгрузку страниц для плавной навигации без перезагрузки.
- Добавьте индикаторы текущего уровня пагинации и пути пользователя (хлебные крошки).
- Кэшируйте результаты запросов для уменьшения нагрузки на сервер.
Для AJAX-подгрузки можно использовать следующий пример на jQuery:
jQuery(document).on('click', '.wpset-pagination a', function(e) {
e.preventDefault();
var url = jQuery(this).attr('href');
jQuery('#content-area').fadeOut(200, function() {
jQuery(this).load(url + ' #content-area > *', function() {
jQuery(this).fadeIn(200);
});
});
});Этот простой скрипт подгружает содержимое без полной перезагрузки страницы, улучшая UX.
Итог: многоуровневая пагинация — ключ к удобной навигации
Создание многоуровневой пагинации требует понимания структуры сайта и правильной работы с WP_Query и URL. Предложенные функции и примеры помогут вам сделать качественную и удобную навигацию даже для сложных сайтов с большим количеством категорий и записей.
Если хотите расширить функционал, советуем ознакомиться с плагином ABC Pagination, который позволит гибко настраивать пагинацию и интегрировать её с вашими темами и типами записей.