Ситуация типовая: в теме или в кастомном шаблоне нужно показать только первую страницу архива, а ссылки на /page/2/, /page/3/ и дальше мешают структуре сайта, создают лишние URL или просто не нужны в конкретном блоке. При этом не хочется ломать основной архив, пагинацию в админке и SEO-логику WordPress.
Ниже — рабочий сценарий именно для отключения пагинации в выводимом списке или в конкретном архиве. Это не про глобальную отмену пагинации на всём сайте: такой подход обычно приводит к проблемам с производительностью и навигацией.
Когда это действительно нужно
Чаще всего задача появляется в одном из трёх случаев:
- на главной или в лендинге выводится блок последних записей, и у него не должно быть второй страницы;
- в кастомном шаблоне архива нужен только первый экран записей без перехода на
/page/2/; - нужно убрать пагинацию у отдельной таксономии, но оставить её в остальных архивах.
Если речь о стандартных архивных страницах блога, категорий или меток, отключать пагинацию нужно осторожно. Иначе вы получите либо бесконечный список записей, либо страницы, которые продолжают существовать, но больше не имеют нормального пути обхода.
Диагностика проблемы: что именно у вас сейчас ломается
Перед правкой кода проверьте, какой именно сценарий у вас в проекте. Это экономит время и помогает не чинить то, что и так работает.
Проверьте, где формируется пагинация
Откройте шаблон: это может быть home.php, archive.php, category.php, front-page.php или кастомный шаблон страницы. Ищите вызовы paginate_links(), the_posts_pagination(), next_posts_link(), previous_posts_link().
Если пагинация собирается через WP_Query, проверьте аргументы paged и posts_per_page. Если это основной запрос, смотрите, не вмешивается ли в него pre_get_posts.
Проверьте, есть ли уже страницы /page/2/
Если URL уже существуют и проиндексированы, простое удаление ссылок из шаблона не решит задачу полностью. Старые адреса могут отдавать 200 OK или редиректиться не туда, куда нужно. В таком случае надо проверить:
- код ответа страницы
/page/2/; - наличие canonical;
- не остались ли ссылки в хлебных крошках, виджетах и XML-карте сайта;
- не генерирует ли тема отдельную пагинацию в нескольких местах.
Как отключить пагинацию в конкретном архиве
Самый безопасный путь — не трогать глобальную логику, а ограничить вывод записей в нужном запросе. Если это основной архив, используйте pre_get_posts. Если это кастомный запрос в шаблоне — задайте posts_per_page и не выводите навигацию.
Вариант 1: убрать пагинацию у основного архива через pre_get_posts
Этот способ подходит, если нужно, чтобы категория, метка или тип записи показывали только первую страницу и не создавали переходы дальше.
add_action('pre_get_posts', function (WP_Query $query) {
if (is_admin() || ! $query->is_main_query()) {
return;
}
if ($query->is_category('news')) {
$query->set('posts_per_page', 20);
$query->set('paged', 1);
}
});Этот код не отключает пагинацию как механизм полностью, но фиксирует вывод на первой странице для выбранной категории. Если пользователь откроет /page/2/, WordPress всё равно попытается обработать запрос. Поэтому для старых URL лучше добавить отдельную обработку.
Вариант 2: отдать 404 для второй и следующих страниц
Если вы сознательно убираете пагинацию из архива, логичнее сделать несуществующими страницы /page/2/ и дальше. Тогда поисковик не будет держаться за старые адреса.
add_action('template_redirect', function () {
if (is_category('news') && get_query_var('paged') > 1) {
global $wp_query;
$wp_query->set_404();
status_header(404);
nocache_headers();
include get_query_template('404');
exit;
}
});Такой вариант уместен, если вы точно не хотите сохранять вторую страницу архива. Но если архив уже в индексе и на него есть внешние ссылки, сначала проверьте последствия: иногда лучше оставить 301-редирект на первую страницу, чем резко отдавать 404.
Если пагинация нужна только в шаблоне, а не в запросе
Иногда проблема не в архиве, а в том, что в шаблоне выводится блок последних записей с навигацией. Тогда проще убрать сам вывод ссылок, а не менять запрос.
<?php
$posts = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 6,
'no_found_rows' => true,
]);
if ($posts->have_posts()) :
while ($posts->have_posts()) : $posts->the_post();
get_template_part('template-parts/content', get_post_type());
endwhile;
endif;
wp_reset_postdata();
?>Здесь ключевой момент — 'no_found_rows' => true. Он отключает расчёт количества страниц для этого запроса. Это полезно для небольших списков на главной, в сайдбаре или в блоке на странице, где пагинация не нужна вообще.
Сравнение подходов: что выбрать
| Подход | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| Убрать вывод ссылок в шаблоне | Пагинация нужна в запросе, но не в интерфейсе | Минимум риска, просто внедрить | Старые URL могут остаться доступными |
pre_get_posts | Нужно изменить поведение основного архива | Работает на уровне запроса | Требует аккуратной проверки условий |
template_redirect + 404 | Нужно убрать вторые страницы полностью | Чёткая SEO-логика для ненужных URL | Нужно убедиться, что это не ломает важные ссылки |
Проверка результата после внедрения
После правки не ограничивайтесь визуальной проверкой на главной. Нужно пройтись по нескольким точкам:
- откройте нужный архив и убедитесь, что ссылки на следующую страницу исчезли;
- проверьте
/page/2/— должен быть 404 или редирект, если вы это предусмотрели; - посмотрите HTML исходник: нет ли в
rel="next"иrel="prev"старых ссылок; - проверьте, не сломались ли хлебные крошки и внутренние ссылки;
- сравните поведение в мобильной и десктопной версии, если тема выводит разные шаблоны.
Если у вас есть доступ к консоли, можно быстро проверить код ответа:
curl -I https://example.com/category/news/page/2/Для ненужной страницы ожидаемо увидеть 404 или корректный 301 на первую страницу, если вы выбрали редирект. Если там остаётся 200, значит URL всё ещё жив и может продолжать индексироваться.
Частые ошибки и как их исправить
Отключили пагинацию только визуально
Частая ошибка — убрать блок навигации в шаблоне, но оставить доступными страницы /page/2/. В результате поисковик всё ещё видит отдельные URL. Если задача SEO-ориентированная, этого недостаточно.
Сломали основной запрос на всём сайте
Если в pre_get_posts не проверить $query->is_main_query() и is_admin(), можно случайно изменить запросы в админке, виджетах и REST-ответах. Это особенно заметно, когда начинают пропадать записи в списках или ломается фильтрация.
Использовали no_found_rows там, где нужна навигация
Этот параметр ускоряет запрос, но отключает расчёт количества страниц. Если потом внезапно понадобится пагинация, навигация просто не сможет построиться корректно. Для блоков без переходов это нормально, для архивов — нет.
Не учли кэш и CDN
После правки старые версии страниц могут ещё какое-то время отдаваться из кэша. Если изменения не видны, очистите кэш плагина, серверный кэш и CDN. Иначе вы будете искать несуществующую ошибку в коде.
Практические советы по производительности и безопасности
Если вы отключаете пагинацию в кастомном списке ради ускорения, не забывайте про нагрузку на запрос. Большой posts_per_page без необходимости — плохая идея. Лучше показывать ограниченное число записей и не тянуть лишние поля.
Для шаблонов с простым списком записей используйте:
no_found_rows => true;ignore_sticky_posts => true, если закреплённые записи не нужны;- точный
post_typeиpost_status; - минимум лишних мета-запросов.
Если вам нужна более системная чистка дублей, технических страниц и SEO-артефактов, имеет смысл посмотреть в сторону плагинов уровня Clearfy Pro. Но даже в этом случае логику конкретного архива лучше проверять руками: универсальная настройка не всегда совпадает с задачей темы.
Что делать, если старые страницы уже в индексе
Если /page/2/ и дальше уже попали в поиск, не ограничивайтесь удалением ссылок из шаблона. Нужен понятный сценарий:
- если страница больше не нужна — отдайте 404;
- если есть логичный аналог — сделайте 301 на первую страницу архива;
- если страница должна существовать, но без пагинации в интерфейсе — оставьте её доступной и уберите только навигацию.
Главное — не смешивать эти сценарии в одном шаблоне. Иначе получится страница, которая одновременно скрыта из интерфейса, но продолжает жить в индексе без явной политики.
Если нужна точечная правка под конкретную тему или архив, безопаснее сначала воспроизвести поведение на staging-окружении, а уже потом переносить код в продакшн. Для таких задач обычно хватает одного аккуратного фильтра или условия в шаблоне, без тяжёлых плагинов и без глобального вмешательства в логику WordPress.