Страницы внутреннего поиска в WordPress часто попадают в индекс не потому, что сайт «плохо настроен», а из-за типовой логики темы: поиск отдаёт обычный архивный URL с параметром ?s=, а робот видит его как отдельную страницу. В результате в выдаче появляются мусорные URL, дубли и пустые результаты поиска.
Задача здесь не просто поставить noindex, а сделать это так, чтобы:
- поисковые системы не индексировали результаты поиска;
- внутренний поиск продолжал работать;
- не ломались канонические URL, пагинация и фильтры;
- не появлялись лишние страницы в sitemap и отчётах краулинга.
Как понять, что проблема именно в страницах поиска
Сначала проверьте, действительно ли индексируются URL с параметром поиска. В Google Search Console и Яндекс Вебмастере обычно видно страницы вида /?s=запрос или более сложные варианты, если тема добавляет свои параметры. Ещё один признак — в логах сервера или аналитике есть много заходов на URL поиска, а в индексе они дают низкокачественный трафик или вообще пустые сниппеты.
Что проверить вручную
- Откройте несколько поисковых URL на сайте:
/?s=test,/search/test/или вариант, который использует тема. - Посмотрите исходный код страницы: есть ли
<meta name="robots" content="noindex,follow">. - Проверьте заголовки ответа: иногда тема или SEO-плагин ставит
X-Robots-Tag, и это даже надёжнее мета-тега. - Убедитесь, что поисковые страницы не попали в XML sitemap.
Диагностика: почему noindex может не сработать
Частая ошибка — добавить правило только в шаблон search.php и считать задачу решённой. Это работает не всегда. Если SEO-плагин переопределяет мета-теги, если страница поиска кэшируется на уровне сервера, или если тема выводит поиск через отдельный шаблон, робот может увидеть другой HTML.
Ещё один нюанс: noindex не запрещает обход страницы. Если на неё есть внутренние ссылки, робот всё равно будет её посещать. Поэтому важно не только закрыть индексацию, но и убрать лишние ссылки из sitemap и шаблонов, где это уместно.
Рабочий способ: закрыть поиск через wp_robots
Начиная с WordPress 5.7, для управления robots-мета удобно использовать фильтр wp_robots. Это безопаснее, чем вручную печатать мета-тег в шаблоне: вы не конфликтуете с темой и можете точечно менять правила только для поисковых страниц.
<?php
add_filter( 'wp_robots', function( array $robots ) {
if ( is_search() ) {
$robots['noindex'] = true;
$robots['nofollow'] = false;
}
return $robots;
} );Здесь мы закрываем именно индексацию, но не ставим nofollow. Для внутреннего поиска это обычно разумнее: робот может пройти по ссылкам на релевантные страницы, но сам результат поиска не будет считаться посадочной страницей.
Когда лучше использовать X-Robots-Tag
Если у вас нестандартная тема, head собирается не через wp_head(), или часть страниц отдается через кэш/CDN, заголовок ответа надёжнее. Его можно добавить на уровне WordPress для поисковых запросов:
<?php
add_action( 'template_redirect', function() {
if ( is_search() && ! headers_sent() ) {
header( 'X-Robots-Tag: noindex, follow', true );
}
} );Этот вариант полезен, если вы не уверены, что SEO-плагин не перезапишет мета-тег. Но не держите оба решения без необходимости в разных местах: лучше выбрать один основной механизм и проверить его в ответе сервера.
Пошаговая настройка без лишних побочных эффектов
- Определите, какой формат URL поиска использует сайт: стандартный
?s=или кастомный маршрут темы. - Добавьте правило
noindex,followчерезwp_robotsили заголовокX-Robots-Tag. - Проверьте, не генерирует ли SEO-плагин отдельные правила для search-страниц.
- Исключите поисковые URL из sitemap, если они туда попали через шаблон или кастомный генератор.
- Очистите кэш страницы, объекта и CDN, иначе робот увидит старую версию.
Если используется SEO-плагин
В большинстве случаев SEO-плагин уже умеет закрывать search results от индексации. Но если у вас есть кастомные фильтры или конфликт с темой, проверьте итоговый HTML. Не полагайтесь на интерфейс настроек: важен именно фактический ответ страницы.
| Подход | Плюсы | Минусы |
|---|---|---|
| SEO-плагин | Удобно, без кода | Может конфликтовать с темой или кастомными фильтрами |
wp_robots | Нативно для WordPress, точечно | Нужно добавить код в тему или mu-plugin |
X-Robots-Tag | Работает на уровне ответа сервера | Сложнее диагностировать при кэше и прокси |
Как не сломать внутренний поиск
Закрытие от индексации не должно отключать сам поиск. Ошибка возникает, когда разработчик начинает редиректить все поисковые URL на главную или на страницу каталога. Это ухудшает UX и может создать цепочки редиректов.
Правильная логика простая: пользователь получает страницу результатов поиска, а робот видит, что индексировать её не нужно. Если у вас есть AJAX-поиск или автодополнение, их тоже не надо массово закрывать от индексации, если они не создают отдельные индексируемые URL.
Проверка результата после внедрения
После изменений проверьте не только визуально, но и технически.
- Откройте
/?s=тести посмотрите исходный код: должен бытьnoindex. - Проверьте заголовки ответа через DevTools,
curl -Iили любой HTTP-инспектор. - Убедитесь, что страница не попадает в sitemap.
- В Search Console отправьте URL на проверку и посмотрите, как робот видит страницу.
- Через несколько обходов проверьте, исчезает ли страница из отчётов как индексируемая.
Пример проверки заголовков через консоль:
curl -I "https://example.com/?s=test"В ответе ищите строку вида X-Robots-Tag: noindex, follow. Если её нет, значит правило не сработало или его перезаписал кэш/прокси.
Частые ошибки и как их исправить
Поставили noindex, но URL всё равно в индексе
Это нормально в краткосрочной перспективе. Поисковику нужно время на повторный обход. Если страница давно в индексе, она не исчезает мгновенно. Проверьте, что правило реально отдается в ответе, а не только прописано в коде.
Закрыли поиск через редирект на главную
Так делать не стоит. Пользователь теряет ожидаемый результат, а робот получает неочевидную логику. Если нужен редирект для пустого поиска, делайте его только для явно пустого запроса, а не для всех search-страниц.
SEO-плагин и тема ставят разные robots-правила
В итоге в HTML может оказаться конфликт: один компонент пишет index,follow, другой — noindex. Проверьте итоговый исходный код и оставьте один источник правды. Если используете код, отключите дублирующую настройку в плагине.
Кэш отдает старую версию
После правки robots-правил обязательно очистите page cache, object cache и CDN. Иначе вы будете смотреть на старый HTML и думать, что код не работает.
Практические советы по безопасности и производительности
Если сайт большой, не добавляйте тяжёлую логику в каждый запрос. Условие is_search() дешёвое, но лишние запросы к базе в этом месте уже не нужны. Для точечных правок лучше использовать mu-plugin, чтобы код не потерялся при смене темы.
Если у вас много мусорных поисковых URL, полезно дополнительно:
- ограничить индексацию параметров в SEO-настройках;
- убрать ссылки на внутренний поиск из XML sitemap;
- не генерировать отдельные архивы поиска для каждого запроса;
- проверить, не создаёт ли тема дубль search-страниц с разными слешами и параметрами.
Когда нужен более широкий аудит дублей, полезно смотреть не только поиск, но и архивы, пагинацию, теги и страницы автора. Для этого часто хватает точечной настройки в SEO-плагине или инструментов вроде Clearfy Pro, если задача именно в чистке дублей и технических страниц, а не в переписывании шаблонов.
Что считать успешным результатом
Решение можно считать рабочим, если выполняются три условия: поисковые URL отдают noindex, внутренний поиск продолжает открываться и не появляется новый поток дублей в отчётах индексации. Если хотя бы один пункт не выполнен, проверьте кэш, конфликт плагинов и итоговый HTML ответа.