Ситуация типовая: на сайте уже есть архивы с пагинацией, но в индексе и в аналитике всплывают лишние варианты URL — с параметрами, мусорными хвостами, дублирующимися страницами списка. Вручную это не вычистить, а просто закрыть всё подряд нельзя: можно потерять нормальные переходы по архивам и получить 404 там, где должны работать страницы списка.
Ниже разберём именно практический сценарий: как убрать лишние параметры из URL пагинации в WordPress, сохранить рабочие страницы архива и не сломать кэш, каноникал и внутренние ссылки.
Когда проблема действительно есть
Сначала стоит понять, что именно вы хотите убрать. Это могут быть:
- параметры сортировки и фильтров, которые добавляются к архивам;
- дубли вида
?paged=2вместо нормального пути/page/2/; - служебные параметры от темы, плагина или формы поиска;
- URL с UTM-метками, которые попали в индекс через внутренние ссылки;
- страницы пагинации, которые открываются, но не должны индексироваться как отдельные посадочные.
Если у вас проблема только в SEO-дублях, а сами страницы работают, решение будет одно. Если же часть URL уже отдаёт 404, сначала нужно чинить маршрутизацию, а потом чистить адреса.
Как быстро диагностировать источник дублей
Проверьте несколько вещей:
- Откройте архив категории или записи и посмотрите, как формируются ссылки на следующую страницу.
- Сравните URL в браузере и в исходном коде: иногда тема выводит один формат, а плагин — другой.
- Посмотрите, не добавляет ли к ссылкам фильтр из плагина кеша, SEO-модуля или кастомной темы.
- Проверьте, есть ли в индексе варианты с параметрами через
site:example.com inurl:pageили через отчёт в панели вебмастера.
Если в адресной строке есть параметры, но они не нужны для контента страницы, их лучше убрать на уровне генерации ссылок и дополнительно закрыть редиректом для старых URL.
Что делать: три рабочих подхода
Здесь важно не смешивать задачи. Один подход отвечает за формирование правильных ссылок, второй — за редирект старых адресов, третий — за контроль индексации.
| Подход | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| Код в теме или mu-plugin | Нужно убрать конкретные параметры и сохранить контроль | Точно, прозрачно, без лишних зависимостей | Требует проверки после обновлений |
| Плагин для редиректов/SEO | Нужно быстро закрыть старые URL | Удобно для массовых правил | Легко переборщить и сломать нормальные адреса |
| Комбинация кода и robots/canonical | Есть и дубли, и индексируемые параметры | Лучший контроль над SEO-сигналами | Нужно аккуратно тестировать |
Пошаговое решение через код
Если задача — убрать лишние параметры из ссылок пагинации, безопаснее всего не переписывать ядро, а отфильтровать итоговый URL. Для этого можно использовать paginate_links и убрать ненужные query args перед выводом.
<?php
/**
* Убирает лишние параметры из ссылок пагинации.
* Подходит для архивов, где пагинация должна быть чистой.
*/
add_filter( 'paginate_links', function( $link ) {
$remove = array( 'utm_source', 'utm_medium', 'utm_campaign', 'sort', 'filter' );
foreach ( $remove as $key ) {
$link = remove_query_arg( $key, $link );
}
return $link;
} );Этот вариант полезен, если тема или плагин добавляют хвосты к ссылкам пагинации. Но если у вас уже есть входящие URL с параметрами, одного фильтра мало — нужен редирект на чистый адрес.
Редирект с параметров на канонический URL
Для старых адресов можно сделать 301-редирект, но только для безопасных случаев. Не редиректите всё подряд: если параметр реально меняет выдачу, например фильтр по таксономии, его нельзя бездумно выкинуть.
<?php
add_action( 'template_redirect', function() {
if ( is_admin() ) {
return;
}
if ( empty( $_SERVER['REQUEST_URI'] ) ) {
return;
}
$request_uri = wp_unslash( $_SERVER['REQUEST_URI'] );
$parts = wp_parse_url( home_url( $request_uri ) );
if ( empty( $parts['query'] ) ) {
return;
}
parse_str( $parts['query'], $query_args );
$remove = array( 'utm_source', 'utm_medium', 'utm_campaign' );
$changed = false;
foreach ( $remove as $key ) {
if ( isset( $query_args[ $key ] ) ) {
unset( $query_args[ $key ] );
$changed = true;
}
}
if ( ! $changed ) {
return;
}
$path = isset( $parts['path'] ) ? $parts['path'] : '/';
$url = home_url( $path );
if ( ! empty( $query_args ) ) {
$url = add_query_arg( $query_args, $url );
}
wp_safe_redirect( $url, 301 );
exit;
} );Здесь логика простая: убираем только те параметры, которые не влияют на содержимое страницы. Для UTM это нормально. Для фильтров каталога — уже нет, если они меняют выборку.
Если проблема в пагинации архива, а не в параметрах
Иногда под “убрать параметры” на самом деле скрывается другая задача: сайт генерирует ссылки вида ?paged=2, а вы хотите нормальный путь /page/2/. В WordPress это обычно решается на уровне шаблона и WP_Query, а не редиректом.
Проверьте, что в кастомном запросе используется корректный параметр paged, а не page, и что в paginate_links() передаётся правильный base. Иначе ссылки будут вести в никуда или дублировать первую страницу.
<?php
$paged = max( 1, get_query_var( 'paged' ) );
$query = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged,
) );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
the_title( '<h2>', '</h2>' );
}
$big = 999999999;
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => $paged,
'total' => $query->max_num_pages,
'prev_text' => 'Назад',
'next_text' => 'Вперёд',
) );
wp_reset_postdata();
}Проверка результата после внедрения
После правок не ограничивайтесь открытием главной страницы архива. Проверять нужно именно те URL, которые раньше ломались или дублировались.
- Откройте архив и перейдите на вторую и третью страницу пагинации.
- Проверьте, что ссылки не содержат лишних параметров.
- Откройте старый URL с параметром и убедитесь, что он отдаёт 301 на чистый адрес.
- Посмотрите исходный код страницы: canonical должен указывать на правильный URL.
- Проверьте ответ сервера через DevTools или
curl -I.
Пример проверки через консоль:
curl -I https://example.com/category/news/?utm_source=test
curl -I https://example.com/category/news/page/2/В первом случае ожидается редирект на чистый URL. Во втором — обычный 200 OK без лишних параметров в адресе.
Частые ошибки и как их исправить
Редирект зацикливается
Это происходит, когда правило редиректа срабатывает на уже очищенный URL или вы не исключили админку и служебные запросы. Проверьте условие на наличие изменённых параметров и не трогайте URL без query string.
Пагинация открывается, но все страницы показывают один и тот же контент
Обычно проблема в том, что кастомный запрос не получает правильный paged. Для архивов это критично: WordPress может считать, что вы всегда на первой странице.
После очистки параметров пропали фильтры
Значит, вы удалили не только мусорные, но и рабочие параметры. Если параметр меняет выборку, его нельзя просто выкинуть. Для таких случаев лучше оставить его в URL и настроить canonical/robots точечно.
Кеш отдаёт старые ссылки
После правок очистите не только браузерный кеш, но и серверный, и плагин кеширования. Если CDN кэширует HTML, он тоже может продолжать отдавать старые URL.
Безопасность и производительность
Если вы делаете редиректы через код, держите список параметров коротким и явным. Не используйте универсальную схему “удалить всё, что не в whitelist”, пока не проверите все сценарии сайта. На живом проекте это часто ломает поиск, фильтры и формы.
Для больших сайтов лучше выносить такой код в mu-plugin, а не в functions.php темы. Тогда правка не исчезнет при смене шаблона и её проще сопровождать.
Если вам нужно не только убрать мусорные URL, но и системно почистить сайт от дублей, служебных меток и лишних SEO-сигналов, имеет смысл посмотреть в сторону инструментов вроде Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином логику редиректов и пагинации всё равно нужно проверять вручную.
Что должно получиться в итоге
После внедрения у вас должны остаться только те URL, которые реально нужны пользователю и поисковику: чистые страницы архива, корректная пагинация, без мусорных параметров и без 404 на старых адресах. Если хотя бы один из этих пунктов не выполняется, сначала ищите источник генерации ссылок, а уже потом настраивайте редиректы.