Пагинация — важный элемент навигации на сайте WordPress, особенно если контента много. Однако нередко при её реализации возникают проблемы: страницы не переключаются, ссылки не работают, или пагинация сбивается на кастомных типах записей и сложных запросах. В этой статье разберёмся, как системно и эффективно отладить пагинацию в WordPress с примерами и советами, чтобы быстро выявлять и исправлять ошибки.
Основные причины проблем с пагинацией в WordPress
Чтобы отладить пагинацию, сначала нужно понять типичные причины сбоев:
- Неправильный параметр
pagedв WP_Query. Многие ошибаются, не передавая корректно текущую страницу. - Конфликты с пермалинками и rewrite правилами. Часто пагинация ломается из-за неверной структуры ссылок.
- Ошибки в шаблонах темы. Например, забытые вызовы
wp_pagenavi()илиpaginate_links(). - Несовместимость с плагинами, изменяющими запросы. Кеширование, фильтры и хуки могут мешать корректной работе.
- Некорректное использование пагинации с AJAX и кешированием. Часто теряется параметр страницы, или результаты кешируются неправильно.
Понимание этих факторов поможет быстро локализовать проблему.
Проверка параметра paged и правильная настройка WP_Query
Частая ошибка — некорректное определение текущей страницы при создании пользовательского запроса. В WordPress текущая страница доступна через глобальную переменную или функцию:
function wppagenavi_get_current_paged() {
if (get_query_var('paged')) {
return get_query_var('paged');
} elseif (get_query_var('page')) {
return get_query_var('page');
} else {
return 1;
}
}
Используйте эту функцию при формировании WP_Query:
$paged = wppagenavi_get_current_paged();
$query = new WP_Query(array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged,
));
Обратите внимание, что параметр paged должен совпадать с тем, что WordPress ожидает. Если вы используете статическую главную страницу, иногда нужно смотреть на page вместо paged.
Пример: правильный вызов пагинации с WP-PageNavi
Если установлен плагин WP-PageNavi, вызов пагинации делается просто:
if (function_exists('wp_pagenavi')) {
wp_pagenavi(array('query' => $query));
}
Передайте объект запроса, чтобы пагинация учитывала именно этот запрос.
Отладка permalink и rewrite правил для пагинации
Проблемы с пагинацией часто связаны с некорректной работой rewrite правил, особенно если структура ссылок сложная или используется кастомная таксономия.
Для начала:
- Перейдите в Настройки → Постоянные ссылки и нажмите «Сохранить изменения» без правок — это сбросит rewrite правила.
- Проверьте, что в URL пагинации присутствует правильный параметр
/page/2/или?paged=2. - Если пагинация используется внутри архивов кастомных типов записей, убедитесь, что для них включена поддержка rewrite с параметром
'has_archive' => trueи правильно настроены slug.
Для более сложных случаев можно вручную добавить rewrite правило:
function wppagenavi_add_rewrite() {
add_rewrite_rule('^custom-post-type/page/([0-9]{1,})/?$', 'index.php?post_type=custom-post-type&paged=$matches[1]', 'top');
}
add_action('init', 'wppagenavi_add_rewrite');
После добавления правил снова сохраните пермалинки.
Использование отладочных инструментов для пагинации
Для выявления проблем с пагинацией полезно использовать следующие методы:
- WP_DEBUG и error_log: включите отладку в
wp-config.php, чтобы видеть предупреждения и ошибки. - Проверка SQL запроса: Включите вывод SQL-запросов с помощью плагинов типа Query Monitor, чтобы убедиться, что в запросе есть правильный параметр
pagedи LIMIT/OFFSET. - Проверка глобальной переменной $wp_query: Иногда в шаблоне пагинация используется совместно с кастомными запросами, что приводит к конфликтам. Убедитесь, что пагинация и запросы синхронизированы.
- Плагин Debug Bar и Debug Bar Extender: Помогают быстро проверить состояние запросов и хуков.
Пагинация и AJAX: отладка проблем с динамическим подгрузом
Если вы используете AJAX для пагинации, то частые ошибки — это потеря параметра текущей страницы или проблемы с кешированием.
Пример базового AJAX-пагинационного обработчика:
add_action('wp_ajax_wppagenavi_load_posts', 'wppagenavi_load_posts_ajax');
add_action('wp_ajax_nopriv_wppagenavi_load_posts', 'wppagenavi_load_posts_ajax');
function wppagenavi_load_posts_ajax() {
$paged = isset($_POST['paged']) ? intval($_POST['paged']) : 1;
$query = new WP_Query(array(
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $paged,
));
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
get_template_part('template-parts/content', get_post_format());
}
} else {
echo '<p>Посты не найдены.</p>';
}
wp_die();
}
В JavaScript нужно корректно передавать параметр paged и обновлять интерфейс без перезагрузки.
Для кеширования AJAX-ответов используйте transient API или объектный кеш, но учитывайте, что кеш должен зависеть от номера страницы.
Советы по отладке пагинации на сложных проектах
В проектах с комплексными запросами и множеством плагинов полезно:
- Использовать кастомные переменные запроса и четко отслеживать
paged. - Во время отладки отключать сторонние плагины, чтобы проверить, не мешают ли они пагинации.
- Проверять правильность работы пагинации в режиме без кеша.
- Использовать плагин Clearfy Pro для оптимизации и устранения конфликтов пагинации, он умеет отключать лишние хуки и повышать стабильность запросов (подробнее).
Заключение: системный подход к отладке пагинации
Пагинация — это не только вывод ссылок, но и правильная работа запросов, URL и совместимость с другими элементами сайта. Отладка требует внимания к деталям: правильное определение номера страницы, корректные rewrite правила, проверка SQL запросов и совместимость с плагинами.
Следуя описанным шагам и рекомендациям, вы сможете быстро найти и исправить проблемы с пагинацией на любом WordPress-сайте.