Если вы сменили структуру ссылок, удалили страницу или объединили несколько материалов в один, старые URL нельзя просто оставить как есть. Пользователь получит 404, а поисковики — сигнал, что адрес больше не работает. В таких случаях нужен 301-редирект: постоянное перенаправление со старого адреса на новый.
В WordPress это можно сделать без плагинов. Чаще всего используют правила сервера в .htaccess или код в теме/дочернем шаблоне. Первый вариант лучше для массовых и постоянных редиректов, второй — для точечных сценариев, когда удобнее управлять логикой из PHP.
Когда 301-редирект действительно нужен
301 используют, когда старый адрес больше не должен открываться как основной, а весь трафик и часть SEO-сигналов нужно передать новому URL. Типичные случаи:
- изменили структуру постоянных ссылок в WordPress;
- удалили страницу, но у неё есть замена;
- объединили несколько статей в одну;
- перенесли материал в другой раздел и старый адрес стал неактуален;
- нужно убрать дубли с www/без www, http/https или со слэшем/без слэша.
Если страницы нет и аналога тоже нет, редирект делать не обязательно. В таких случаях иногда правильнее оставить 404 или вернуть 410, но это уже отдельная задача и не всегда подходит под вашу цель.
Самый практичный способ: редирект через .htaccess
Для сайтов на Apache или LiteSpeed это обычно самый быстрый и надёжный вариант. Правила читаются на уровне веб-сервера, поэтому WordPress даже не успевает загрузиться. Это удобно, если редиректов много или они должны работать независимо от темы.
Перед правкой сделайте резервную копию файла .htaccess. Ошибка в синтаксисе может временно сломать доступ к сайту, особенно если вы редактируете основной файл в корне WordPress.
Откройте .htaccess в корне сайта и добавьте правило выше стандартного блока WordPress, если оно относится к конкретному адресу или группе адресов. Пример редиректа одной страницы:
Redirect 301 /old-page/ https://example.com/new-page/Это простое правило подходит для переноса одного URL. Важно, чтобы путь слева был относительным от корня сайта, а справа — уже полный новый адрес.
Если нужно перенаправить несколько старых адресов на разные новые, добавляйте отдельную строку для каждого случая:
Redirect 301 /old-post/ https://example.com/new-post/
Redirect 301 /category/old-section/ https://example.com/category/new-section/Редирект через mod_rewrite для более гибких правил
Когда нужно учитывать шаблоны URL, удобнее использовать RewriteRule. Этот вариант полезен, если структура менялась массово, например при переходе с одного формата ссылок на другой. Но здесь уже важна аккуратность: одно неверное правило может создать цикл редиректов или задеть лишние страницы.
Пример перенаправления конкретного старого адреса на новый:
RewriteEngine On
RewriteRule ^old-page/?$ https://example.com/new-page/ [R=301,L]Флаг R=301 задаёт постоянный редирект, а L останавливает обработку правила после срабатывания. Если вы пишете такие правила в WordPress-сайте, не удаляйте стандартные строки RewriteEngine On и блок, который WordPress использует для своих permalink-правил.
Если сайт работает на Nginx, .htaccess не поможет: Nginx его не читает. В этом случае редиректы настраиваются в конфигурации сервера или через панель хостинга, если она позволяет добавлять server-level rules.
Как сделать редирект через PHP в WordPress
Если у вас нет доступа к настройкам веб-сервера или редирект нужен только для нескольких страниц внутри WordPress, можно использовать PHP. Такой способ подходит для точечных перенаправлений, но он зависит от темы и загрузки WordPress: если тема отключена или код удалён, редирект перестанет работать.
Самый безопасный вариант — добавить код в functions.php дочерней темы или в собственный мини-плагин. Не вносите такие правки в родительскую тему: при обновлении они пропадут.
Пример редиректа по конкретному URL на фронтенде:
add_action('template_redirect', function () {
if (is_page('old-page')) {
wp_redirect('https://example.com/new-page/', 301);
exit;
}
});Здесь is_page('old-page') проверяет страницу по слагу. Для записей можно использовать is_single('old-post'), а для рубрик — is_category('old-category'). После вызова wp_redirect() обязательно нужен exit, иначе WordPress продолжит вывод страницы.
Если нужно перенаправить не по типу записи, а по конкретному адресу, можно проверить $_SERVER['REQUEST_URI']. Но такой код нужно писать аккуратно, чтобы не получить ложные срабатывания. Для большинства обычных задач проще и надёжнее использовать условные теги WordPress.
Что выбрать: серверное правило или код в теме
| Способ | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
.htaccess | Apache/LiteSpeed, много редиректов, постоянные правила | Быстро, не зависит от темы, работает до загрузки WordPress | Нужен доступ к файлу, ошибка может сломать сайт |
| PHP в WordPress | Несколько точечных редиректов, нет доступа к серверу | Удобно для логики внутри WordPress, легко завязать на тип записи | Зависит от темы или плагина-контейнера, работает медленнее |
| Конфиг Nginx | Сайт на Nginx, доступ к настройкам сервера есть | Надёжно и быстро | Нужен доступ к конфигурации или поддержка хостинга |
Если у вас есть доступ к серверу, для постоянных редиректов я бы выбирал именно серверный уровень. PHP-способ оставил бы для редких случаев, когда нужно быстро закрыть несколько старых адресов без вмешательства в конфигурацию веб-сервера.
Как настроить редирект после смены структуры ссылок
Самая частая задача — переход на новую структуру постоянных ссылок. Например, раньше адреса были вида /2024/05/post-name/, а теперь стали короче: /post-name/. В такой ситуации не нужно вручную прописывать каждую страницу, если формат меняется по шаблону.
Но здесь важно понимать границу: WordPress сам умеет менять структуру постоянных ссылок для новых записей, а старые URL после этого не перенаправляет автоматически. Значит, если старые адреса уже проиндексированы, вам всё равно нужны правила редиректа.
Для массового переноса сначала проверьте, можно ли описать старую структуру одним шаблоном. Если да — делайте правило на уровне сервера. Если нет, составьте список старых URL и сопоставьте их с новыми вручную. Для небольшого сайта это часто быстрее и надёжнее, чем пытаться написать слишком умное правило.
Как проверить, что 301 работает правильно
После настройки не ограничивайтесь открытием страницы в браузере. Браузер может кэшировать редирект, и вы не увидите реальную картину. Лучше проверить ответ сервера.
Самый простой способ — выполнить запрос через curl:
curl -I https://example.com/old-page/В ответе должен быть статус 301 Moved Permanently и заголовок Location с новым адресом. Если вы видите 200 OK, редирект не сработал. Если появился другой код, например 302, значит перенаправление временное, а не постоянное.
Ещё один практичный тест — открыть старый URL в приватном окне и посмотреть, куда он ведёт. Но это только дополнительная проверка, не основная. Для точной диагностики лучше смотреть именно HTTP-ответ.
Ошибки, из-за которых редирект не срабатывает
Чаще всего проблема не в самом WordPress, а в деталях правила:
- правило написано ниже блока, который его перекрывает;
- в
.htaccessдопущена ошибка синтаксиса; - сервер работает на Nginx, а вы правите файл для Apache;
- редирект ведёт на тот же URL и создаёт цикл;
- в PHP-коде забыли
exitпослеwp_redirect(); - браузер или CDN кэширует старый ответ.
Если редирект зациклился, сайт может стать недоступным для части посетителей. В этом случае проще всего вернуть резервную копию файла или временно отключить добавленный код, а потом проверять правило уже на тестовом адресе.
Для сложных миграций полезно сначала составить карту переноса: старый URL, новый URL, тип редиректа и дата изменения. Это не обязательная формальность, а нормальная рабочая практика, когда страниц много и правки будут вноситься не один раз.
Когда без плагина лучше, а когда нет
Без плагинов редиректы удобны, если вы понимаете, где именно они должны жить: в конфиге сервера, в .htaccess или в коде темы. Такой подход не создаёт лишней нагрузки и не добавляет ещё один слой администрирования.
Но если редиректов десятки или сотни, а управлять ими будет не разработчик, а редактор или SEO-специалист, ручная правка кода быстро становится неудобной. В этом случае плагин может быть практичнее именно как интерфейс для управления правилами. Для задач, связанных с чисткой сайта и устранением дублей, иногда используют Clearfy Pro, но для самой настройки 301-редиректов он не нужен и не заменяет серверные правила.
Если задача простая — один старый адрес, несколько перенесённых страниц или массовый перенос структуры на уровне сервера — редиректы без плагинов обычно самый прямой и предсказуемый путь. Главное не смешивать способы без необходимости и не держать одно и то же правило одновременно в .htaccess, PHP и настройках хостинга: так сложнее понять, что именно срабатывает.