После смены структуры постоянных ссылок в WordPress чаще всего ломаются не только старые URL из поисковой выдачи, но и внутренние ссылки, RSS, архивы и часть медиафайлов. Если сайт уже проиндексирован, такие 404 быстро превращаются в технический шум: поисковик продолжает ходить по старым адресам, а пользователи получают пустую страницу вместо контента.
Ниже разберём рабочий сценарий: как понять, что именно сломалось, чем отличаются единичные 404 от системной проблемы, как восстановить редиректы и как проверить, что всё действительно заработало.
Когда проблема не в одном URL, а в структуре ссылок
Если после изменения permalink у вас появились 404 на старых адресах, это не всегда ошибка темы или плагина. В WordPress старый путь может остаться в:
- внутренних ссылках в записях и страницах;
- меню и виджетах;
- картах сайта;
- ссылках на изображения, если они были вставлены вручную;
- внешних ссылках из поисковиков и соцсетей.
Отдельно стоит проверить, не менялся ли одновременно category base, tag base или структура записей. Тогда 404 могут затронуть не только посты, но и рубрики, метки и архивы авторов.
Что обычно ломается после смены permalink
На практике чаще всего встречаются три сценария:
- Старые URL стали отдавать 404, но новые открываются нормально.
- Новые URL тоже отдают 404, потому что не обновились правила перезаписи.
- Часть адресов работает, а часть — нет, потому что конфликтует кэш или редирект-цепочка.
Если вы видите только первый вариант, проблема обычно решается редиректами. Если второй или третий — сначала нужно проверить настройки WordPress и серверный кэш.
Диагностика: где искать причину 404
Начинать лучше не с плагинов, а с проверки фактического ответа сервера. Это помогает отделить проблему WordPress от проблемы веб-сервера или кэша.
Проверьте, что именно отдаёт URL
Возьмите старый адрес и посмотрите заголовки ответа. Удобно использовать curl:
curl -I https://example.com/old-post-url/Если в ответе сразу 404, а в админке запись существует, значит старый путь не перенаправлен. Если сначала идёт 301, а потом 404, вероятно, редирект ведёт на неправильный новый URL.
Ещё один полезный тест — открыть новый адрес в режиме инкогнито и без кэша браузера. Иногда проблема маскируется локальным кэшем или плагином оптимизации.
Сбросьте правила перезаписи
После изменения структуры ссылок WordPress должен пересобрать rewrite rules. Самый простой способ — зайти в Настройки → Постоянные ссылки и нажать Сохранить изменения без правок. Это не магия, а штатный способ обновить правила.
Если вы меняли permalink программно или через миграцию, проверьте, не остались ли старые правила в кэше объекта или на уровне сервера. На некоторых хостингах помогает очистка кэша Nginx/Apache и кэша плагина.
Пошаговое решение: как вернуть старые URL без потери трафика
Если структура ссылок уже изменилась, а старые адреса успели попасть в индекс, лучше не надеяться на автоматическое восстановление. Нужны явные 301-редиректы со старых URL на новые.
Шаг 1. Составьте список старых и новых адресов
Нужен хотя бы минимальный маппинг. Для небольшого сайта его можно собрать вручную из:
- Google Search Console или Яндекс Вебмастера;
- логов сервера;
- экспорта старых URL из sitemap;
- внутреннего поиска по базе, если менялась структура записей.
Если адресов много, не пытайтесь править каждый вручную в редакторе записей. Лучше сделать правило на уровне сайта или сервера.
Шаг 2. Добавьте редирект для конкретного старого шаблона
Если у вас менялся только префикс, можно использовать template_redirect и проверять старый путь. Пример ниже — для случая, когда старые записи были в формате /blog/post-name/, а новые стали просто /post-name/:
add_action('template_redirect', function () {
$request_uri = $_SERVER['REQUEST_URI'] ?? '';
if (strpos($request_uri, '/blog/') !== 0) {
return;
}
$new_path = preg_replace('#^/blog/#', '/', $request_uri);
$target = home_url($new_path);
wp_redirect($target, 301);
exit;
});Этот вариант годится только для понятного и стабильного шаблона. Если структура сложнее, лучше делать редиректы через карту соответствий или на уровне сервера.
Шаг 3. Для точечных URL используйте карту редиректов
Когда старых адресов немного, безопаснее хранить их в массиве и перенаправлять только конкретные страницы:
add_action('template_redirect', function () {
$map = [
'/old-about/' => '/about/',
'/old-contact/' => '/contacts/',
'/blog/seo-checklist/' => '/seo-checklist/',
];
$request_uri = parse_url($_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH);
if (!$request_uri || !isset($map[$request_uri])) {
return;
}
wp_redirect(home_url($map[$request_uri]), 301);
exit;
});Плюс такого подхода в том, что вы не заденете лишние URL. Минус — карту нужно поддерживать вручную, если адресов становится много.
Шаг 4. Если редиректов много, перенесите их в сервер
Для массовых правил лучше использовать конфигурацию веб-сервера или специализированный плагин редиректов. На уровне PHP это работает, но при большом количестве правил может добавлять лишнюю нагрузку на WordPress.
| Подход | Когда подходит | Компромисс |
|---|---|---|
| Плагин редиректов | Много URL, нужен интерфейс | Дополнительная админка и зависимость от плагина |
| Код в теме или mu-plugin | Несколько стабильных правил | Нужно поддерживать вручную |
| Редиректы на сервере | Большой сайт, важна скорость | Нужен доступ к конфигу хостинга |
Проверка результата после внедрения
После настройки редиректов важно не ограничиваться открытием одной страницы в браузере. Нужна проверка цепочки ответа и индексации.
Что проверить руками
- Старый URL отдаёт
301, а новый —200. - Нет цепочки из нескольких редиректов подряд.
- Внутренние ссылки в контенте ведут сразу на новый адрес.
- Карта сайта содержит только актуальные URL.
- Страница не блокируется
noindexслучайно из-за SEO-плагина.
Для быстрой проверки можно снова использовать curl:
curl -I https://example.com/old-post-url/
curl -I https://example.com/new-post-url/Если старый URL возвращает 301, а новый — 200, базовая часть задачи решена. Дальше стоит проверить несколько адресов из Search Console или логов, чтобы убедиться, что правило не зацепило лишние страницы.
Что смотреть в Search Console
В отчёте по страницам с ошибкой 404 полезно отфильтровать:
- старые записи с внешними ссылками;
- URL с опечатками;
- адреса с параметрами, которые больше не используются;
- страницы, которые должны были быть перенесены, но не попали в карту редиректов.
Если после исправления 404 продолжают появляться, значит кто-то всё ещё ссылается на старый адрес — либо внутри сайта, либо снаружи.
Частые ошибки и как их исправить
Редирект ведёт на несуществующую страницу
Обычно это происходит, когда в коде неправильно собрали новый путь. Проверьте, не потерялись ли слэши, языковой префикс или часть slug. В таких случаях помогает сравнение старого и нового URL в логике редиректа, а не ручная подстановка строки.
После сохранения permalink всё равно 404
Причина часто в том, что правила перезаписи не обновились или их перехватывает кэш. Сначала сохраните настройки постоянных ссылок ещё раз, затем очистите кэш плагина и серверный кэш. Если используется CDN, проверьте и его.
Редиректов слишком много и сайт стал медленнее
Если вы сделали десятки или сотни правил через template_redirect, WordPress будет проверять их на каждом запросе. Для небольшого сайта это терпимо, но для нагруженного проекта лучше перенести правила в конфиг сервера или в плагин, который умеет работать с редиректами без лишней логики в теме.
Сломались изображения и вложения
Если менялась структура медиа-URL или путь к uploads, 404 могут возникать не только на страницах, но и на картинках. В этом случае проверьте, не были ли ссылки на изображения вставлены вручную в HTML. Иногда достаточно обновить старые URL в базе, но делать это нужно аккуратно и только после резервной копии.
Чек-лист перед публикацией изменений
- Сделан бэкап базы и файлов.
- Проверены старые и новые URL в браузере и через
curl. - Сохранены настройки постоянных ссылок.
- Добавлены 301-редиректы для всех известных старых адресов.
- Очистен кэш WordPress, сервера и CDN.
- Проверены внутренние ссылки в меню, контенте и виджетах.
- Карта сайта обновлена и содержит только актуальные адреса.
Когда лучше не писать редиректы в теме
Если правка касается не одного сайта, а регулярной поддержки проектов, не стоит держать редиректы в файле темы. При смене темы вы потеряете логику перенаправлений. Для таких задач лучше использовать mu-plugin или отдельный плагин, а не шаблон оформления.
Если нужен более системный подход к чистке дублей, редиректам и технической SEO-гигиене, имеет смысл смотреть в сторону инструментов, которые работают на уровне сайта, а не только темы. Например, Clearfy Pro закрывает часть типовых технических задач WordPress, включая чистку и SEO-настройки: https://wpshop.ru/plugins/clearfy.
Главная проверка здесь простая: старый URL должен стабильно отдавать 301, новый — 200, а в отчётах по ошибкам не должно оставаться массовых 404 на уже перенесённые страницы. Если это выполняется, значит проблема решена не косметически, а технически.