В WordPress встроенный поиск часто становится источником мусорных страниц: пустые выдачи, дубли с параметром ?s=, странные запросы из ботов и пользователей, которые ищут по служебным словам. Если сайт не использует поиск как ключевую функцию, проще не «допиливать» стандартную выдачу, а либо отключить её, либо заменить на предсказуемый сценарий: редирект, понятная страница без индексации или поиск по нужным типам контента.
Ниже разберём рабочие варианты без выдуманных хуков и без магии. Сначала — как понять, что проблема именно в поиске, потом — как отключить его аккуратно, как проверить результат и где обычно ломают сайт.
Когда встроенный поиск WordPress мешает
Типичный симптом — в логах и аналитике появляются запросы вида ?s=, ?s=abc, ?s=2024, а в индексе или в отчётах по краулингу всплывают страницы поиска. На небольшом корпоративном сайте это обычно не нужно: поиск не помогает пользователю, зато создаёт лишние URL и нагрузку на шаблон.
Проверить, что проблема действительно в поиске, можно так:
- откройте несколько URL вида
/ ?s=тести посмотрите, что отдаёт тема; - проверьте, есть ли у страницы поиска
noindexи каноникал; - посмотрите, не индексируются ли результаты поиска в Google Search Console;
- проверьте, не создаёт ли тема отдельный шаблон
search.phpс тяжёлым запросом; - посмотрите, не ведут ли внутренние ссылки на пустые поисковые URL.
Что именно нужно сделать: три рабочих сценария
Здесь важно не путать отключение поиска и «починку» поиска. Если поиск на сайте вообще не нужен, лучше убрать его из интерфейса и обработать запросы на сервере. Если поиск нужен, но выдача плохая, тогда имеет смысл ограничить его по типам записей или заменить на более строгий шаблон.
| Подход | Что делает | Минус |
|---|---|---|
| Скрыть форму поиска | Убирает поле из шапки, сайдбара, футера | Пользователь всё ещё может открыть ?s= вручную |
| Редиректить поисковые URL | Перенаправляет запросы поиска на главную или на отдельную страницу | Нужно аккуратно выбрать целевую страницу |
| Оставить поиск, но ограничить | Искать только по постам, страницам или CPT | Требует доработки шаблона и запроса |
Диагностика: что ломается в текущей теме
Перед правкой кода проверьте, не решается ли задача настройкой темы или плагина. Часто поиск выводится через виджет, блок или хук в шаблоне. Если вы используете тему с готовыми настройками, сначала отключите поисковую форму там, где она подключена, а уже потом трогайте PHP.
Если проблема в индексации, а не в интерфейсе, посмотрите исходный код страницы поиска. Нормальный вариант для «пустой» или служебной выдачи — noindex, follow и каноникал на саму страницу поиска либо на целевую страницу, если поиск отключён полностью. Но если поиск не нужен, лучше не оставлять его как отдельный индексируемый URL.
Пошаговое решение: отключаем поиск через код
Самый надёжный способ — обработать запросы поиска на уровне template_redirect. Это не ломает тему и не зависит от того, где именно форма поиска выведена.
<?php
add_action( 'template_redirect', function () {
if ( is_search() ) {
wp_safe_redirect( home_url( '/' ), 301 );
exit;
}
} );Этот вариант подходит, если поиск на сайте не нужен вообще. Пользователь, который откроет ?s=что-то, попадёт на главную. Если у вас есть более логичная страница-замена — например, раздел статей или каталог — подставьте её URL вместо главной.
Если нужно убрать только форму поиска, а URL поиска оставить без редиректа, можно удалить вывод формы из темы. Но это уже зависит от конкретной реализации: в одном шаблоне форма вставлена напрямую, в другом — через виджет, в третьем — через блок.
Отключение поиска через фильтр
Если вы хотите не только редиректить, но и отключить саму отправку поискового запроса через форму, можно перехватить запрос на раннем этапе и вернуть 404. Это полезно, когда поисковый URL не должен существовать как рабочая страница.
<?php
add_action( 'template_redirect', function () {
if ( is_search() ) {
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
include get_query_template( '404' );
exit;
}
} );Такой вариант уместен, если вы сознательно хотите убрать поиск из сайта и не передавать пользователей на главную. Но для SEO это не всегда лучший путь: если поисковые URL уже были в индексе, резкий переход на 404 может выглядеть как массовое удаление страниц. В этом случае сначала лучше поставить 301 на релевантную страницу, а потом уже решать, нужен ли 404.
Если поиск нужен, но выдача должна быть нормальной
Иногда проблема не в самом поиске, а в том, что он ищет по всему подряд: по страницам, вложениям, черновым сущностям темы, служебным типам записей. Тогда лучше ограничить поиск только нужными типами контента.
<?php
add_action( 'pre_get_posts', function ( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'post_type', array( 'post', 'page' ) );
$query->set( 'posts_per_page', 10 );
}
} );Это не отключает поиск, но делает его предсказуемее. Если у вас есть собственный тип записей, добавьте его в массив. Если страницы не нужны в выдаче, оставьте только post. Для некоторых проектов этого достаточно, чтобы убрать мусорные результаты и ускорить запрос.
Как не сломать индексацию и поведение ботов
После отключения поиска проверьте, что поисковые URL не создают лишнюю нагрузку и не попадают в индекс. Если вы делаете редирект на главную, убедитесь, что это не превращается в цепочку редиректов. Если отдаёте 404, проверьте, что код ответа действительно 404, а не 200 с текстом ошибки.
Полезный чек-лист после внедрения:
- открывается ли
/?s=testи куда ведёт; - нет ли редирект-цепочки через HTTP и HTTPS;
- не остаётся ли форма поиска в шапке, футере, сайдбаре;
- не индексируются ли старые поисковые URL;
- не растёт ли число 404 в логах после изменения;
- не сломались ли хлебные крошки и навигация в теме.
Проверка результата после внедрения
Проверять нужно не только глазами. Откройте поисковый URL в браузере и через curl, чтобы увидеть реальный код ответа.
curl -I https://example.com/?s=testЕсли вы настроили редирект, в ответе должен быть 301 и заголовок Location с целевым URL. Если выбрали 404, проверьте именно статус 404 Not Found, а не только внешний вид страницы.
Дальше откройте исходный код целевой страницы и убедитесь, что:
- нет лишнего canonical на поисковый URL;
- нет мета-тега
noindexтам, где он не нужен; - поисковая форма не осталась в шаблоне через другой блок или виджет;
- в sitemap не попали служебные URL поиска — обычно они и не должны попадать, но лучше проверить.
Частые ошибки и как их исправить
Редирект на главную без проверки контекста
Если отправлять все поисковые запросы на главную, пользователь теряет смысл запроса. Для контентного сайта лучше отправлять на раздел статей, на страницу справки или на страницу с популярными материалами. Главная — допустимый, но не всегда удачный вариант.
Ставят 302 вместо 301
Если вы отключаете поиск надолго, временный редирект не нужен. 301 понятнее для браузеров и поисковых систем. 302 имеет смысл только если вы тестируете поведение и планируете вернуть поиск обратно.
Ломают админку или AJAX
Не вешайте логику отключения поиска на слишком общий фильтр без проверки is_admin() и is_main_query(). Иначе можно задеть служебные запросы темы, REST API или внутренние запросы плагинов.
Оставляют форму поиска в шаблоне
Даже если URL уже редиректится, форма в шапке продолжает отправлять пользователя в никуда. Проверьте все места вывода: header.php, сайдбар, мобильное меню, блоки в редакторе, виджеты.
Что выбрать: код, плагин или настройку темы
Если нужен быстрый и безопасный вариант без разработки, иногда достаточно плагина для управления SEO-мета-тегами и дублями. Например, в Clearfy Pro есть инструменты, которые помогают чистить сайт от лишних сущностей и закрывать технические страницы. Но если задача именно в поведении поиска, код обычно надёжнее: вы контролируете редирект, статус ответа и логику для конкретного проекта.
Для проектов с нестандартной темой я бы делал так: сначала отключил форму в шаблоне, потом добавил редирект на уровне template_redirect, затем проверил индексацию старых URL и только после этого решил, нужен ли отдельный шаблон поиска или лучше полностью убрать этот сценарий.
Если поиск на сайте всё-таки нужен, не пытайтесь чинить его только CSS-ом или скрытием поля. Это косметика. Нормальная правка — либо ограничение запроса через pre_get_posts, либо замена логики поиска на более подходящий сценарий.