Старые версии страниц в WordPress обычно всплывают после редактирования структуры сайта, смены ЧПУ, переноса материалов или правок в плагинах, которые создают свои URL. В результате в индексе остаются дубли: старая запись, новая запись, вложенная версия, тестовая копия, иногда еще и служебная страница из темы или плагина. Проблема не только в SEO: такие URL мешают аналитике, распыляют внутренний вес и иногда продолжают отдавать 200 OK, хотя пользователю они уже не нужны.
Ниже разберем практический сценарий: как понять, какие именно старые версии надо закрыть, чем отличается noindex от редиректа и когда лучше не трогать индексацию, а сразу отдавать 301.
Когда проблема действительно есть
Сначала стоит убедиться, что речь не о нормальной истории изменений, а о реально доступных страницах, которые поисковик может обходить и индексировать. Если URL открывается в браузере, отдает код ответа 200 и в HTML нет явного запрета на индексацию, поисковая система может считать его полноценной страницей.
Типичные признаки
- в поиске находятся старые URL после смены структуры постоянных ссылок;
- в индексе есть страницы с одинаковым контентом, но разными адресами;
- в отчетах Search Console появляются дубли без выбранной канонической страницы;
- внутренние ссылки ведут и на новый, и на старый адрес;
- страница уже не нужна, но продолжает отвечать
200 OK.
Если старый адрес должен полностью заменить новый, обычно правильнее делать 301-редирект. Если же URL нужен технически, но не должен попадать в поиск, тогда уместен noindex или закрытие через X-Robots-Tag.
Что именно закрывать: диагностика перед правкой
Не все старые URL надо запрещать одинаково. Сначала разделите их на три группы: страницы, которые нужно перенаправить; страницы, которые должны остаться доступными, но не индексироваться; и страницы, которые можно удалить совсем.
Проверьте код ответа и мета-роботы
Для начала откройте проблемный URL и посмотрите заголовки ответа. Если есть доступ к серверу или SSH, удобно проверить так:
curl -I https://example.com/staryy-url/Смотрите на три вещи: код ответа, Location при редиректе и наличие X-Robots-Tag. Если страница отдает 200 и не содержит запрета на индексацию, поисковик видит ее как обычную страницу.
В браузере полезно проверить и исходный HTML: есть ли тег <meta name="robots" content="noindex">, не подставляет ли тема или SEO-плагин канонический URL на другую страницу, и не дублируется ли контент через архивы, теги или пагинацию.
Сравнение подходов
| Подход | Когда использовать | Плюс | Минус |
|---|---|---|---|
| 301-редирект | Старый URL заменен новым | Передает сигнал переезда | Нельзя использовать для страниц, которые должны остаться отдельными |
noindex | Страница нужна пользователю, но не поиску | Гибко и безопасно | Страница остается доступной и может обходиться ботом |
| Удаление с 404/410 | Страница больше не нужна | Чистое удаление из индекса | Нужно убедиться, что нет важных ссылок и трафика |
Как закрыть старые версии страниц в WordPress
На практике есть два рабочих пути: через SEO-плагин или через код. Если у вас уже стоит плагин с управлением мета-роботами, проще использовать его. Если нужна точечная логика для отдельных шаблонов, лучше добавить код в тему или мини-плагин.
Вариант 1: закрыть страницу через SEO-плагин
Если плагин умеет задавать noindex для конкретной записи, это самый безопасный способ для редактора. Обычно достаточно открыть старую страницу, найти настройки индексации и выставить запрет на индексацию, оставив доступ для обхода ссылок, если это нужно.
Важно не путать noindex с удалением из поиска. Если страница уже не должна существовать, лучше настроить редирект или вернуть 404/410. Иначе бот может продолжать тратить краулинговый бюджет на бесполезный URL.
Вариант 2: добавить noindex через код
Если нужно закрыть, например, все старые версии страниц в отдельной папке или все записи с определенным шаблоном, можно использовать фильтр wp_robots. Это штатный способ WordPress, он не требует выдуманных хуков и нормально работает с современными темами.
add_filter( 'wp_robots', function( $robots ) {
if ( is_page() ) {
$post_id = get_queried_object_id();
// Пример: закрываем конкретные старые страницы по ID.
$noindex_ids = array( 123, 456, 789 );
if ( in_array( $post_id, $noindex_ids, true ) ) {
$robots['noindex'] = true;
$robots['nofollow'] = false;
}
}
return $robots;
} );Этот код лучше держать в дочерней теме или в небольшом mu-plugin, а не в functions.php активной темы, если тема часто меняется. Для массовой логики можно проверять не только ID, но и шаблон страницы, категорию или собственное поле.
Вариант 3: закрыть через заголовок X-Robots-Tag
Если старые версии отдаются не только как HTML-страницы, но и как PDF, изображения или другие файлы, удобнее ставить запрет на уровне заголовков. Для обычных страниц WordPress это не всегда нужно, но в некоторых конфигурациях серверный заголовок надежнее, чем мета-тег в HTML.
add_action( 'send_headers', function() {
if ( is_page() ) {
$post_id = get_queried_object_id();
$noindex_ids = array( 123, 456, 789 );
if ( in_array( $post_id, $noindex_ids, true ) ) {
header( 'X-Robots-Tag: noindex, nofollow', true );
}
}
} );Такой вариант стоит использовать аккуратно: заголовок должен соответствовать реальной задаче страницы. Не ставьте nofollow без причины, если страница нужна для переходов внутри сайта.
Если нужна не индексация, а переезд: ставим 301
Когда старый URL заменен новым адресом, запрет на индексацию не решает задачу полностью. Поисковик может еще долго хранить старую страницу в базе, а пользователи будут попадать на неактуальный адрес из закладок и внешних ссылок. В этом случае нужен редирект 301.
Для WordPress самый простой вариант — штатная функция wp_redirect() с корректным статусом ответа. Пример для точечного перенаправления:
add_action( 'template_redirect', function() {
if ( is_page( 'staryy-adres' ) ) {
wp_redirect( home_url( '/novyy-adres/' ), 301 );
exit;
}
} );Если таких URL много, лучше не плодить десятки отдельных условий в теме. Вынесите список в массив или настройте редиректы на уровне сервера или специализированного плагина. Но проверьте, чтобы не было цепочек вида старый URL → промежуточный URL → новый URL. Для SEO и скорости это плохой вариант.
Пошаговое решение без лишнего риска
- Соберите список старых URL из Search Console, логов сервера и внутренних ссылок сайта.
- Определите, какие адреса должны редиректить, какие — остаться доступными, но с
noindex, а какие можно удалить. - Проверьте, не используется ли старый URL в меню, хлебных крошках, блоках и XML-карте сайта.
- Настройте 301 для замененных страниц.
- Для технических дублей добавьте
noindexчерезwp_robotsили SEO-плагин. - После правок обновите карту сайта и отправьте на переобход только нужные URL.
Как проверить, что решение сработало
Проверка должна быть не только визуальной. Откройте старый URL и убедитесь, что он ведет себя так, как вы задумали.
- для 301: в ответе должен быть статус
301и корректныйLocation; - для
noindex: в HTML или заголовках должен быть явный запрет на индексацию; - для удаленной страницы: должен быть
404или410, а не пустая страница с кодом200; - внутренние ссылки должны вести только на актуальный адрес;
- в Search Console нужно проверить, как бот видит страницу после повторного обхода.
Дополнительно полезно открыть исходный код страницы и найти строку с robots-мета. Если вы используете SEO-плагин, убедитесь, что он не переопределяет ваш код и не ставит противоположный сигнал.
Частые ошибки и как их исправить
Ставят noindex вместо редиректа
Это частая ошибка при миграции. Страница остается доступной по старому адресу, но поисковику просто говорят не показывать ее в выдаче. Если у страницы есть новый аналог, нужен 301, а не noindex.
Закрывают страницу, но оставляют внутренние ссылки
Если меню, блоки рекомендаций или хлебные крошки продолжают ссылаться на старый URL, бот будет регулярно возвращаться к нему. После настройки редиректа или запрета на индексацию проверьте ссылки в шаблонах, виджетах и контенте.
Используют robots.txt для уже проиндексированных страниц
Disallow в robots.txt не удаляет страницу из индекса сам по себе. Если URL уже известен поисковику, он может остаться в выдаче без сниппета. Для удаления нужен редирект, noindex или ответ 404/410.
Ставят nofollow без необходимости
Если задача только убрать страницу из поиска, nofollow обычно не нужен. Он может мешать передаче сигналов по внутренним ссылкам и не решает проблему дублирования сам по себе.
Делают цепочки редиректов
После нескольких переездов старый URL иногда ведет на промежуточный адрес, а тот — на новый. Это лишняя задержка и лишняя нагрузка. Сведите все старые адреса сразу к финальному URL.
Что учесть для безопасности и производительности
Если вы закрываете старые версии через код, не разбрасывайте логику по нескольким файлам темы. Лучше держать правила в одном месте, чтобы не потерять их при обновлении. Для большого числа правил удобнее отдельный mu-plugin: он не отключится случайно при смене темы.
Не ставьте тяжелые проверки на каждом запросе без необходимости. Если список старых URL большой, лучше опираться на ID, шаблон или заранее подготовленный массив, а не делать сложные запросы к базе в template_redirect на каждой странице.
Если у вас много технических дублей, имеет смысл проверить и общую чистку сайта: архивы, теги, вложения, страницы автора и служебные URL. В некоторых проектах часть этой работы проще закрыть через настройки SEO-плагина или инструменты вроде Clearfy Pro, если он уже используется в стеке и подходит под вашу схему управления индексированием.
Главная мысль простая: старый URL надо не просто спрятать, а обработать правильным способом. Если страница переехала — редирект. Если нужна, но не для поиска — noindex. Если больше не нужна — удаление с корректным кодом ответа. Тогда индекс чистится предсказуемо, а сайт не теряет техническую целостность.