Страницы внутреннего поиска в WordPress часто попадают в индекс сами по себе: поисковый робот находит URL вида ?s=, обходит результаты и начинает считать их отдельными страницами. Для сайта это обычно лишний шум: дубли, мусорные URL в отчётах, размывание краулингового бюджета и иногда — странные сниппеты в выдаче.
Ниже — практический разбор, как закрыть такие страницы от индексации без лишних побочных эффектов и как проверить, что всё действительно сработало.
Когда проблема уже есть: как её диагностировать
Сначала убедитесь, что в индекс попали именно поисковые страницы, а не обычные записи или архивы. Самый простой способ — посмотреть отчёт по страницам в Google Search Console и отфильтровать URL с параметром ?s=. Если у вас есть доступ к логам сервера, можно увидеть и обход таких адресов ботами.
Типичные признаки:
- в индексе есть URL вида
/ ?s=ключевое+словоили/search/ключевое-слово/; - в выдаче отображаются страницы с пустым или нерелевантным сниппетом;
- в отчётах по покрытию появляются URL с параметрами поиска;
- внутренний поиск генерирует много однотипных страниц с тонким контентом.
Важно не путать индексацию поисковых страниц с индексацией результатов фильтров в каталоге или архивов таксономий. Для них стратегия может быть другой.
Что именно нужно закрывать
В WordPress внутренний поиск обычно живёт на URL с параметром s. Например:
https://example.com/?s=seoЕсли тема или плагин переписывают поиск в человеко-понятный URL, логика та же: нужно закрыть именно страницы результатов поиска, а не форму поиска и не страницу, где она размещена.
Что не стоит делать
Не закрывайте весь сайт через robots.txt только потому, что хотите убрать поиск из индекса. Это грубый способ: робот перестанет обходить и полезные страницы, а уже проиндексированные URL могут остаться в выдаче без нормального обновления.
Также не стоит просто ставить noindex на все страницы шаблона без проверки, если на этом же шаблоне отображаются не только результаты поиска, но и другие важные элементы.
Пошаговое решение: закрываем поиск от индексации
Самый надёжный вариант — отдать поисковым страницам мета-тег noindex,follow. Тогда страница не будет индексироваться, но робот сможет пройти по ссылкам внутри неё, если они есть.
Добавьте код в functions.php дочерней темы или в небольшой mu-plugin.
<?php
add_action('wp_head', function () {
if (is_search()) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
}, 1);Если вы используете SEO-плагин, проверьте, не добавляет ли он уже собственный noindex. Дублировать мета-теги не нужно: это не ломает сайт, но создаёт путаницу при диагностике.
Для более жёсткого варианта можно отправлять заголовок X-Robots-Tag. Это полезно, если шаблон поиска генерируется не только HTML-страницей, но и другими ответами, где мета-тег не поможет.
<?php
add_action('template_redirect', function () {
if (is_search() && !headers_sent()) {
header('X-Robots-Tag: noindex, follow', true);
}
});Обычно достаточно одного способа. Если вы уже добавили noindex в <head>, не спешите дублировать его заголовком без необходимости.
Если нужен не только noindex, но и защита от мусорных запросов
Иногда проблема не в индексации, а в том, что поиском злоупотребляют боты или пользователи отправляют пустые запросы. Тогда имеет смысл дополнительно ограничить поведение формы поиска.
Например, можно не показывать результаты для слишком коротких запросов и возвращать 404, если запрос пустой. Делать это нужно аккуратно, чтобы не сломать UX.
<?php
add_action('template_redirect', function () {
if (!is_search()) {
return;
}
$query = trim((string) get_search_query(false));
if ($query === '' || mb_strlen($query) < 2) {
global $wp_query;
$wp_query->set_404();
status_header(404);
nocache_headers();
include get_query_template('404');
exit;
}
});Этот вариант уместен только если на сайте нет сценария, где пустой поиск должен показывать каталог или подборку. Для обычного блога это чаще всего нормально, для сложного каталога — уже нет.
Сравнение подходов: плагин, код, robots.txt
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| SEO-плагин | Если уже используется и умеет управлять robots meta | Быстро, без кода | Нужно проверить, не конфликтует ли с темой |
| Код в теме / mu-plugin | Если нужен точечный контроль над is_search() | Прозрачно и предсказуемо | Требует аккуратного теста после обновлений |
robots.txt | Редко, только для технических ограничений обхода | Просто добавить правило | Не решает проблему индексации надёжно |
Если у вас уже стоит плагин для SEO, сначала проверьте его настройки. В ряде случаев проще включить noindex для страниц поиска в интерфейсе плагина, чем поддерживать отдельный код.
Проверка результата после внедрения
После изменений не ограничивайтесь визуальной проверкой страницы. Нужно убедиться, что робот видит правильные сигналы.
- Откройте страницу поиска в браузере и посмотрите исходный код: должен быть
noindex,followили заголовокX-Robots-Tag. - Проверьте ответ сервера через
curl -Iили инструменты разработчика. - В Search Console отправьте URL на проверку и посмотрите, как Google читает страницу.
- Через несколько обходов проверьте, исчезает ли URL из отчётов по индексированию.
Пример проверки заголовков:
curl -I "https://example.com/?s=seo"В ответе вы должны увидеть либо заголовок X-Robots-Tag: noindex, follow, либо убедиться, что в HTML есть корректный meta robots. Если этого нет, значит код не сработал или выполняется не там, где нужно.
Частые ошибки и как их исправить
Ставят noindex не на поиск, а на весь шаблон
Такое случается, когда условие написано слишком широко. Например, вместо is_search() используют общий шаблон страницы или проверку на архив. В результате под раздачу попадают нормальные страницы сайта.
Исправление простое: ограничьте условие именно поиском и проверьте, что оно не срабатывает на обычных записях, страницах и архивах.
Закрывают поиск через robots.txt и ждут удаления из индекса
Disallow мешает обходу, но не гарантирует удаление уже известных URL. Если страница уже в индексе, нужен noindex или удаление через инструменты поисковой системы.
Оставляют дубли с разными параметрами
Иногда поиск генерирует URL с дополнительными параметрами сортировки, фильтрации или пагинации. Если закрыт только ?s=, а остальные варианты открыты, дубли останутся.
Проверьте, какие именно URL создаёт ваша тема или плагин поиска, и закройте все технически одинаковые варианты.
Не проверяют конфликт с SEO-плагином
Если SEO-плагин уже управляет robots meta, ваш код может не дать ожидаемого результата или будет перебит настройками плагина. Сначала найдите источник тега в исходном коде, потом меняйте логику.
Практические советы по безопасности и производительности
Если внутренний поиск часто атакуют ботами, стоит смотреть не только на индексацию, но и на нагрузку. Поиск по сайту может быть дорогим запросом, особенно на больших базах данных. В таком случае полезны:
- ограничение слишком коротких запросов;
- кэширование результатов поиска на уровне объекта или страницы, если это допустимо;
- отсечение пустых и мусорных запросов;
- контроль логов на всплески обращений к
?s=.
Если нужен более широкий контроль над дублями, техническими страницами и индексацией, в экосистеме WPShop есть Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином полезно понимать, какие именно URL он закрывает и как это отражается в HTML.
В итоге рабочая схема обычно выглядит так: найти все варианты поисковых URL, закрыть их от индексации через noindex или заголовок, проверить ответ сервера и убедиться, что в Search Console новые поисковые страницы перестали появляться как отдельные документы.