После смены структуры URL в WordPress чаще всего ломается не сам сайт, а его адресная логика: одна и та же страница начинает открываться по нескольким путям, а поисковик видит дубли. На практике это проявляется как старые адреса в индексе, страницы с ?amp, ?replytocom, версии с / и без /, а иногда — дубли из-за архивов, тегов и пагинации. Если это не привести в порядок, каноникал и редиректы начинают спорить между собой, а переобход поисковыми роботами затягивается.
Что именно считать дублем после смены URL
Не каждый повторный адрес — проблема. Дублем в контексте технической оптимизации обычно считается страница, которая отдает тот же контент, но доступна по другому URL и может попасть в индекс отдельно. Для WordPress это особенно заметно после изменения структуры постоянных ссылок, переноса сайта или чистки старых правил.
Типовые источники дублей
- старые URL после смены
/%postname%/или другой структуры постоянных ссылок; - страницы с и без завершающего слеша;
- дубли из архивов рубрик, тегов и авторов;
- параметры в URL:
?replytocom,?utm_*,?amp, сортировки и фильтры; - страницы вложений медиафайлов, если они открываются как отдельные страницы;
- дубли из-за неправильного canonical или цепочек редиректов.
Диагностика: где искать проблему до правки кода
Сначала нужно понять, какие именно дубли уже есть. Иначе легко исправить не то: например, настроить редирект со старых записей, но оставить открытыми attachment-страницы или архивы с тонким контентом.
Проверка в Search Console и логике сайта
Откройте отчеты по индексированию и вручную сравните несколько URL. Если одна и та же запись доступна по старому и новому адресу, а старый URL не уходит в 301, это уже технический дубль. Если в поиске есть и канонический адрес, и параметрический вариант, значит поисковик видит несколько путей к одному контенту.
Быстрая проверка через браузер и curl
Полезно проверить коды ответа и заголовок Location. Это помогает увидеть, есть ли 301, 302 или вообще нет редиректа.
curl -I https://example.com/staryi-url/
curl -I https://example.com/novyi-url/
Если старый адрес отвечает 200 OK вместо 301 Moved Permanently, поисковик может продолжать считать его самостоятельной страницей.
Пошаговое решение: как убрать дубли после смены структуры URL
Лучше идти в таком порядке: сначала редиректы, потом каноникал, затем чистка лишних архивов и параметров. Если сделать наоборот, можно получить конфликт между плагином, темой и серверными правилами.
Шаг 1. Настройте 301-редиректы со старых адресов
Если структура ссылок менялась массово, самый надежный вариант — прописать редиректы на уровне сервера или через плагин редиректов. Для единичных случаев можно использовать template_redirect, но это не лучший путь для большого количества URL.
add_action('template_redirect', function () {
if (is_admin() || wp_doing_ajax()) {
return;
}
$old_path = '/old-post-url/';
$new_url = home_url('/novyi-post-url/');
if (untrailingslashit($_SERVER['REQUEST_URI']) === untrailingslashit($old_path)) {
wp_redirect($new_url, 301);
exit;
}
});
Этот пример годится только как точечная мера. Если старых URL много, лучше использовать карту редиректов в конфигурации сервера или плагин, который умеет хранить правила централизованно.
Шаг 2. Убедитесь, что canonical указывает на один адрес
WordPress обычно выводит canonical автоматически, но после вмешательства темы или SEO-плагина он может стать некорректным. Проверяйте исходный код страницы: у канонического URL должен быть один вариант, без параметров и без старых путей.
Если нужно принудительно поправить canonical для конкретного типа записей, используйте фильтр wpseo_canonical только если у вас установлен Yoast SEO. Для ядра WordPress безопаснее не ломать стандартную логику без необходимости.
Шаг 3. Закройте от индексации мусорные архивы и служебные страницы
Если после смены URL у вас всплыли архивы тегов, авторов или вложений без ценности, их лучше либо закрыть от индексации, либо сделать редирект на родительский контент. Для медиафайлов часто достаточно отключить страницы вложений и вести пользователя на сам файл или запись-родитель.
Если вы используете плагин для технической чистки сайта, вроде Clearfy Pro, проверьте, не включены ли одновременно несколько механизмов: редирект вложений, noindex для архивов и отдельные правила каноникализации. Дубли часто появляются не из-за отсутствия настройки, а из-за конфликта настроек между плагинами.
Шаг 4. Уберите параметрические дубли
Параметры ?replytocom и некоторые UTM-метки не должны создавать отдельные индексируемые страницы. Для UTM обычно достаточно canonical на чистый URL. Для ?replytocom лучше проверить, не генерирует ли тема или плагин лишние ссылки на комментарии.
Если параметр нужен только для аналитики, не пытайтесь редиректить его на сервере без проверки: можно сломать трекинг. В таких случаях правильнее оставить параметр для пользователя, но не давать ему становиться отдельной индексируемой страницей.
Когда лучше править кодом, а когда плагином
| Подход | Когда подходит | Минус |
|---|---|---|
| Плагин редиректов | Много старых URL, нужен интерфейс и журнал правил | Дополнительная нагрузка и риск конфликтов |
| Код в теме / mu-plugin | Несколько точечных правил, нужен контроль в репозитории | Нужно аккуратно сопровождать при обновлениях |
| Серверные правила | Большой объем редиректов, важна скорость | Сложнее отлаживать без доступа к конфигу |
Проверка результата после внедрения
После настройки не ограничивайтесь открытием страницы в браузере. Нужно проверить и ответ сервера, и поведение поисковых сигналов.
Что проверить вручную
- старый URL отдает
301на новый; - новый URL отдает
200 OKбез цепочки редиректов; - в исходном коде canonical совпадает с новым адресом;
- страницы архивов, которые вы закрывали, действительно не индексируются;
- внутренние ссылки на сайте ведут сразу на новый URL, а не через редирект.
Проверка через браузер и инструменты разработчика
Откройте вкладку Network и посмотрите, нет ли цепочки из двух-трех редиректов. Один 301 — нормально. Если сначала идет 302, потом 301, это уже лишняя задержка и потенциальная путаница для робота.
Проверка через Search Console
После переобхода старые адреса должны постепенно выпадать из индекса, а новые — закрепляться как канонические. Если этого не происходит, ищите либо внутренние ссылки на старые URL, либо дубли в sitemap, либо конфликт canonical.
Частые ошибки и как их исправить
Редирект сделан на 302 вместо 301
302 сообщает, что переезд временный. Для смены структуры URL это почти всегда неверно. Исправление простое: ставьте постоянный редирект 301 и проверьте, что его не переопределяет другой плагин или правило сервера.
Старые адреса остались в XML-карте сайта
Если sitemap продолжает отдавать старые URL, поисковик будет снова и снова их обходить. Проверьте генератор карты сайта и убедитесь, что в нее попадают только актуальные канонические адреса.
Внутренние ссылки ведут на старые страницы
Это частая причина, почему редиректы не исчезают из логов. После миграции нужно обновить ссылки в меню, контенте, блоках и шаблонах. Иначе вы просто создаете лишнюю нагрузку на сайт и сервер.
Плагин SEO и плагин редиректов спорят между собой
Один плагин может ставить canonical, другой — переписывать URL, третий — закрывать архивы. В итоге поисковик получает противоречивые сигналы. Оставьте один источник правды для canonical и один инструмент для редиректов.
Практические советы по безопасности и производительности
Не храните десятки правил редиректа в произвольных местах темы. Лучше вынести их в mu-plugin или в серверную конфигурацию, чтобы они не потерялись при смене темы. Это особенно важно, если сайт обновляется командой и редиректы должны переживать деплой.
Если вы используете плагины для чистки дублей и технической оптимизации, не включайте сразу все опции подряд. Сначала проверьте одну настройку, затем следующую. Так проще понять, что именно сломало каноникал или редирект.
Для сайтов с большим количеством старых URL полезно вести отдельный список перенаправлений и периодически проверять 404-логи. Это помогает находить забытые адреса, которые еще приходят из внешних ссылок или старых закладок.
add_action('template_redirect', function () {
if (is_admin() || wp_doing_ajax()) {
return;
}
if (is_attachment()) {
$parent = wp_get_post_parent_id(get_queried_object_id());
if ($parent) {
wp_redirect(get_permalink($parent), 301);
exit;
}
}
});
Этот пример показывает безопасный способ убрать часть дублей от вложений: если у медиафайла есть родительская запись, пользователь сразу попадает на нее. Но перед включением проверьте, не нужны ли вам отдельные страницы вложений по редакционному сценарию.
Если нужно быстро навести порядок на сайте после миграции, удобно сочетать ручную проверку с инструментами технической чистки. Но даже хороший плагин не заменяет контроль редиректов, sitemap и внутренних ссылок. Именно эти три точки обычно и создают дубли после смены структуры URL.