Если внутренний поиск на сайте не нужен посетителям, его лучше убрать с фронтенда полностью: скрыть форму, не показывать страницу результатов и при этом не задеть поиск в админке, виджеты в панели и шаблонные вызовы темы. Это особенно полезно, когда поиск даёт мусорные URL вида ?s=..., создаёт пустые страницы результатов или просто отвлекает пользователей от основной навигации.
Самый надёжный подход здесь — не «ломать» поиск глобально, а отключать его только для гостей на публичной части сайта. Тогда администраторы и редакторы по-прежнему смогут пользоваться поиском в панели WordPress, а тема не начнёт сыпать ошибками из-за вызовов get_search_form() или is_search().
Что именно нужно отключить
В WordPress поиск состоит из двух разных частей:
- форма поиска на фронтенде — обычно в шапке, сайдбаре, мобильном меню или в блоке темы;
- страница результатов поиска — это обычный шаблон архива, который открывается по запросу
?s=текст.
Если убрать только форму, посетители не увидят поле поиска, но URL с ?s=... всё ещё можно открыть вручную или получить из старых ссылок. Если скрыть только страницу результатов, форма останется, но пользователь будет попадать в пустой или перенаправленный экран. Для задачи «отключить поиск для гостей» обычно нужны оба шага.
Самый безопасный вариант: скрыть форму и перенаправлять запросы поиска гостей
Ниже — рабочий способ для темы или небольшого mu-plugin. Он не отключает поиск в админке и не мешает внутренним вызовам WordPress, но для неавторизованных посетителей убирает форму поиска и отправляет запросы поиска на главную страницу или на другую нужную вам страницу.
Если вы редактируете functions.php, сначала сделайте резервную копию. Ошибка в этом файле может временно вывести сайт из строя. Надёжнее добавить код в дочернюю тему или в отдельный мини-плагин.
Сначала скрываем форму поиска для гостей. WordPress использует фильтр get_search_form, поэтому можно подменить HTML формы на пустую строку:
add_filter( 'get_search_form', function( $form ) {
if ( is_admin() || current_user_can( 'read' ) ) {
return $form;
}
return '';
} );Этот вариант убирает форму только на фронтенде для неавторизованных пользователей. Для администратора, редактора и других пользователей с правом read форма останется. Если у вас на сайте есть особая логика ролей, можно заменить проверку на is_user_logged_in(), но в большинстве случаев удобнее именно ограничение по способности, а не по роли.
Теперь нужно убрать саму страницу результатов поиска. Для этого используется редирект на этапе шаблона:
add_action( 'template_redirect', function() {
if ( is_admin() || current_user_can( 'read' ) ) {
return;
}
if ( is_search() ) {
wp_safe_redirect( home_url( '/' ), 302 );
exit;
}
} );Здесь важны две детали. Во-первых, проверка is_admin() не даёт коду вмешиваться в панель WordPress. Во-вторых, wp_safe_redirect() безопаснее обычного wp_redirect(), потому что WordPress проверяет адрес назначения. Код ответа 302 подходит для временного отключения. Если вы уверены, что поиск отключён надолго, можно использовать 301, но только если действительно не планируете возвращать его обратно в ближайшее время.
Как не сломать поиск в админке и шаблонах
Частая ошибка — пытаться «выключить поиск» через жёсткую блокировку всех запросов с параметром s. Так делать не стоит. На сайте могут быть:
- поиск в админке WordPress;
- поиск, который тема использует в AJAX-скриптах или в мобильном меню;
- внутренние шаблонные проверки, где
is_search()влияет на вывод заголовка, хлебных крошек или мета-тегов.
Если вы просто начнёте возвращать 404 на любой запрос с ?s=, можно получить побочные эффекты в теме и плагинах. Поэтому лучше ограничивать отключение только фронтендом и только для гостей, как в примере выше.
Если у вас есть собственный шаблон поиска, который не должен исчезать для авторизованных пользователей, оставьте его доступным. Тогда редакторы смогут проверять, как выглядит выдача, а обычные посетители будут попадать на главную или на другую страницу с полезной навигацией.
Если нужно не перенаправлять, а отдавать 404
Иногда задача не в том, чтобы отправить пользователя на главную, а в том, чтобы полностью убрать страницу результатов из индекса и из пользовательского доступа. Тогда вместо редиректа можно отдавать 404 для гостей. Это уже более жёсткое решение, и его стоит применять только если вы понимаете последствия: пользователь увидит ошибку страницы, а не аккуратный переход.
Пример:
add_action( 'template_redirect', function() {
if ( is_admin() || current_user_can( 'read' ) ) {
return;
}
if ( is_search() ) {
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
include get_query_template( '404' );
exit;
}
} );Этот вариант полезен, если вы хотите, чтобы поисковые URL не вели никуда и не создавали ощущение «пустого поиска». Но для обычного сайта чаще удобнее редирект на главную или на страницу каталога, разделов, контактов — туда, где посетитель действительно может продолжить путь.
Как скрыть форму поиска в теме без кода, если она добавлена через настройки
Если поиск выводится не кодом, а настройками темы, сначала проверьте кастомайзер, настройки хедера, виджетов и блоков. Во многих темах поле поиска можно убрать без правки файлов. Это самый простой путь, если вам нужно только скрыть интерфейс поиска, а не управлять логикой запроса.
Но даже если форма исчезла из шаблона, это не отменяет страницу результатов. Адрес с ?s=... всё равно может открыться вручную или попасть в историю браузера. Поэтому для задачи из заголовка лучше сочетать визуальное отключение формы и серверный редирект или 404 для гостей.
Как проверить, что всё работает правильно
После изменений проверьте сайт в двух режимах: как гость и как авторизованный пользователь.
Для гостя:
- форма поиска не отображается в шапке, сайдбаре и других местах, где она была;
- переход на URL вида
https://site.ru/?s=testне открывает страницу результатов; - пользователь попадает на главную, нужную страницу или видит 404 — в зависимости от выбранного варианта.
Для администратора или редактора:
- вход в панель WordPress работает как обычно;
- поиск в админке не сломан;
- если вы оставили форму для авторизованных пользователей, она по-прежнему видна.
Если после установки кода поиск всё ещё открывается у гостей, проверьте, не кэширует ли сайт старую версию страницы. На хостинге, в плагине кэша или в CDN может храниться HTML с формой поиска и старой логикой редиректа. После очистки кэша изменения обычно становятся видны сразу.
Когда лучше не отключать поиск полностью
Полное отключение поиска оправдано не всегда. Если у вас большой каталог материалов, документация, база знаний или интернет-магазин, поиск часто остаётся важным способом навигации. В таком случае лучше не убирать его для всех, а ограничить только гостевой доступ к форме или перенаправлять пустые и бесполезные запросы.
Если же поиск на сайте действительно не нужен, а проблема в основном в мусорных URL и лишней нагрузке на шаблоны, описанный выше способ решает задачу без вмешательства в ядро WordPress и без риска сломать админку. Это практичнее, чем пытаться отключать поиск на уровне всей системы.
Если вам нужно ещё и убрать дублирующиеся служебные страницы сайта, в том числе связанные с шаблонной разметкой и SEO-обвязкой, это уже отдельная задача. Но для отключения поиска у гостей достаточно аккуратного редиректа и скрытия формы на фронтенде.