Как закрыть старые URL в WordPress через 301 и canonical без потери индексации

Старые URL в WordPress обычно остаются после смены структуры постоянных ссылок, переезда с другой CMS, правки рубрик, удаления тегов или чистки дублей. Если просто удалить страницу, поисковик получает 404 или цепочку редиректов. Если ничего не делать, в индексе остаются старые адреса, а вес расползается по дублям.

Рабочая схема здесь простая: 301 для реально переехавших страниц, canonical для дублей, которые должны жить как одна основная версия, и 404/410 для того, что действительно больше не нужно. Ниже — как это разложить без лишней магии и как проверить результат.

Когда проблема уже есть: что искать в логах и в индексе

Сначала стоит понять, с чем именно вы имеете дело. Старый URL может вести на:

  • страницу с 404, хотя у неё есть новый адрес;
  • цепочку редиректов вида /old//new//new/?amp;
  • дубль одной и той же страницы с разными параметрами;
  • архив рубрики, который дублирует контент записи;
  • страницу, где canonical указывает не туда или вообще отсутствует.

Быстрая диагностика

Проверьте несколько типичных URL вручную и через инструменты разработчика. Для старых адресов важно увидеть не только код ответа, но и конечный URL после редиректа.

curl -I https://example.com/old-page/

Смотрите на три вещи: HTTP/1.1 301 Moved Permanently, заголовок Location и отсутствие лишних промежуточных переходов. Если вместо 301 приходит 200, значит страница не закрыта от дублей. Если цепочка длинная, её стоит сократить.

Для canonical проверьте исходный код страницы или вкладку View Source. Должен быть один явный тег:

<link rel="canonical" href="https://example.com/new-page/" />

Если на странице несколько canonical или один из них генерируется плагином, а другой темой, поисковик может проигнорировать оба.

Что выбрать: 301, canonical или 404

Не все старые адреса нужно перенаправлять. Иногда правильнее оставить 404 или отдать 410. Ниже — короткое сравнение подходов.

СитуацияЧто делатьКомпромисс
Страница переехала на новый URL301 redirectПользователь и робот попадают на актуальную версию
Одна и та же страница доступна по нескольким адресамcanonical на основную версиюДубли остаются доступны, но сигнал консолидации уходит в один URL
Контент удалён окончательно404 или 410Индекс очищается не сразу, но адрес перестаёт считаться рабочим

Если у вас есть старый пост, который был перенесён и обновлён, canonical сам по себе не заменяет редирект. Для переезда нужен именно 301, иначе старый URL может продолжать индексироваться как отдельная сущность.

Пошаговое решение: закрываем старые URL в WordPress

Шаг 1. Составьте список старых адресов

Начните с самых частых источников дублей: старые слаги, рубрики, теги, страницы с параметрами, версии без слэша и с ним. Если сайт уже давно живёт, полезно выгрузить URL из Search Console, серверных логов и карты сайта старой версии.

Не пытайтесь закрыть всё одной универсальной регуляркой. Для WordPress это часто заканчивается редиректом на нерелевантную страницу и потерей трафика.

Шаг 2. Настройте точечные 301-редиректы

Если редиректов немного, их можно добавить в functions.php темы или, что лучше, в небольшой mu-plugin. Ниже пример для нескольких конкретных старых адресов:

<?php
add_action('template_redirect', function () {
    $path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');

    $map = [
        'old-page'   => 'new-page',
        'about-us-2'  => 'about',
        'services-v1' => 'services',
    ];

    if (isset($map[$path])) {
        wp_redirect(home_url('/' . $map[$path] . '/'), 301);
        exit;
    }
});

Этот вариант подходит только для небольшого числа адресов. Если редиректов десятки или сотни, лучше использовать серверный уровень или специализированный плагин редиректов, чтобы не нагружать PHP на каждом запросе.

Шаг 3. Уберите дубли через canonical

Canonical нужен там, где контент один, а URL несколько. Например, у записи есть параметры сортировки, UTM-метки или альтернативный путь из архива. В WordPress базовый canonical обычно уже выводится, но его стоит проверить, если тема или SEO-плагин вмешиваются в head.

Если нужно принудительно задать canonical для конкретного шаблона, можно использовать фильтр wpseo_canonical в Yoast SEO или аналогичный механизм вашего SEO-плагина. Для чистого WordPress безопаснее не подменять canonical глобально, а исправить источник дубля.

Пример для случая, когда на странице архива нужно указать основную версию записи:

<?php
add_filter('get_canonical_url', function ($canonical, $post) {
    if ($post instanceof WP_Post && has_category('news', $post)) {
        return get_permalink($post);
    }
    return $canonical;
}, 10, 2);

Этот фильтр сработает только в тех местах, где WordPress действительно формирует canonical через get_canonical_url(). Если у вас SEO-плагин подставляет свой тег, проверяйте именно его настройки и фильтры.

Шаг 4. Для удалённых страниц отдавайте 410, если это оправдано

Когда контент удалён без замены, 410 может быть честнее, чем 301 на главную. Это особенно полезно для мусорных страниц, старых тестовых материалов и технических дублей, которые не имеют ценного аналога.

<?php
add_action('template_redirect', function () {
    if (is_page('old-test-page')) {
        status_header(410);
        nocache_headers();
        echo 'Gone';
        exit;
    }
});

Не используйте 410 для страниц, которые просто переехали. Если есть релевантная новая версия, 301 почти всегда лучше.

Проверка результата после внедрения

После настройки важно не ограничиваться открытием страницы в браузере. Проверка должна показать, что:

  • старый URL отдаёт ровно один 301;
  • новый URL открывается с кодом 200;
  • canonical на новой странице указывает на саму себя или на нужную основную версию;
  • в sitemap нет удалённых адресов;
  • в Search Console не растёт число исключённых URL из-за цепочек и дублей.

Минимальный набор проверок через curl:

curl -I https://example.com/old-page/
curl -I https://example.com/new-page/

Если хотите увидеть всю цепочку, используйте:

curl -IL https://example.com/old-page/

В идеале старый адрес должен сразу вести на новый без промежуточных редиректов. Если после 301 идёт ещё один 301, это уже лишняя задержка и дополнительный риск для индексации.

Частые ошибки и как их исправить

Редирект на главную вместо релевантной страницы

Это типичная ошибка после массовой чистки. На сервере или в плагине настраивают общий шаблон, и все удалённые URL улетают на главную. Для поисковика это слабый сигнал: страница не заменена, а просто потеряна. Исправление простое — сопоставьте старый адрес с ближайшим релевантным новым URL или отдайте 410.

Canonical указывает на страницу с параметрами

Если canonical включает ?utm_source=... или другие параметры, поисковик может считать такие версии отдельными. Canonical должен вести на чистый основной адрес без маркетинговых хвостов.

Смешаны правила в .htaccess и в плагине

Когда часть редиректов живёт в .htaccess, а часть — в плагине, легко получить дублирующиеся правила и циклы. Лучше выбрать один источник для серверных редиректов и один для логики canonical.

Удалили страницу, но оставили её в sitemap

Это частая причина повторного обхода несуществующих URL. После удаления страницы проверьте генератор карты сайта и исключите адрес из XML sitemap.

Практические советы по безопасности и производительности

Не делайте массовые редиректы через PHP-обработчик на каждый запрос, если можно решить это на уровне сервера. Для большого сайта это лишняя нагрузка. Если редиректов много, удобнее хранить их в плагине редиректов или в конфигурации веб-сервера.

Если вы используете SEO-плагин, проверьте, не создаёт ли он собственные canonical и редиректы поверх вашей логики. Для чистки дублей и технических хвостов в WordPress часто помогает Clearfy Pro, но его всё равно нужно настраивать под конкретный сценарий, а не включать все опции подряд.

Перед массовыми изменениями сделайте бэкап базы и списка редиректов. Если что-то пойдёт не так, откат должен быть быстрым: особенно когда меняется структура URL у уже проиндексированного сайта.

Когда стоит остановиться и не усложнять

Если старый URL уже не получает трафик, не имеет внешних ссылок и не связан с важным контентом, иногда достаточно 404 или 410. Не каждый адрес нужно спасать редиректом. Лишние перенаправления только раздувают конфигурацию и усложняют поддержку.

Рабочий критерий простой: если у старого адреса есть понятный новый эквивалент — ставьте 301. Если есть дубль одной и той же страницы — оставляйте canonical. Если страницы больше не должно существовать — закрывайте её честно, без имитации замены.

Как удалить скрипт отложенной загрузки в WordPress
05.03.2026
Как использовать хуки WooCommerce для автоматизации управления заказами
19.07.2026
Как использовать WP-Cron для автоматизации задач WooCommerce без ошибок
29.06.2026
Как добавить уникальные метаданные в WordPress для локализации сайта
18.03.2026
Как избежать конфликтов между плагинами WordPress: практические решения
21.01.2026