Проблема: нежелательные страницы появляются в результатах поиска WordPress
Поиск WordPress по умолчанию выводит все опубликованные записи и страницы. Иногда нужно исключить из результатов поиска определённые страницы — например, страницы с условиями использования, политики конфиденциальности или внутренние страницы, не предназначенные для пользователей. Это особенно актуально, если не хочется устанавливать дополнительные плагины ради простой задачи.
Диагностика: как проверить, что страницы участвуют в поиске
Для начала убедитесь, что страницы действительно отображаются в результатах поиска.
- Перейдите на сайт, выполните поиск по части заголовка или содержимого страницы, которую хотите исключить.
- Если страница отображается — значит, WordPress её учитывает.
- Также можно проверить SQL-запрос поиска через плагин Query Monitor или включив отладку WP_DEBUG и просмотром запросов к базе.
Решение: исключение страниц из результатов поиска через functions.php
Самый надёжный способ — использовать хук pre_get_posts, который позволяет модифицировать основной запрос поиска.
Пример кода для исключения страниц по ID:
function exclude_pages_from_search(\WP_Query $query) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
// ID страниц, которые нужно исключить из поиска
$excluded_ids = array(42, 56, 78);
$query->set('post__not_in', $excluded_ids);
}
}
add_action('pre_get_posts', 'exclude_pages_from_search');Если нужно исключить страницы по шаблону URL или по определённому метаполю, можно расширить логику. Например, исключение по метаполю exclude_from_search=1:
function exclude_pages_by_meta_from_search(\WP_Query $query) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
$meta_query = array(
array(
'key' => 'exclude_from_search',
'compare' => 'NOT EXISTS'
)
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'exclude_pages_by_meta_from_search');Пример добавления метаполя к странице
Для удобства можно вручную добавить метаполе через админку или программно:
update_post_meta(42, 'exclude_from_search', '1');Проверка результата после внедрения
- Очистите кэш сайта и браузера, если установлен кэш.
- Выполните поиск по ключевым словам, связанным с исключёнными страницами.
- Убедитесь, что эти страницы больше не выводятся в результатах.
- Если используете сторонние поисковые решения или плагины, проверьте, что изменения работают и там.
Частые ошибки и как их исправить
- Код не работает, страницы не исключаются: проверьте, что функция подключена в файле
functions.phpактивной темы или в кастомном плагине, и что хукpre_get_postsправильно применяется. - Исключаются не те записи: возможно, конфликтуют другие параметры запроса, или в запросе уже установлен
post__not_in. Можно получить текущие исключения и добавить к ним новые:
function exclude_pages_from_search(\WP_Query $query) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
$excluded_ids = array(42, 56, 78);
$current_exclude = $query->get('post__not_in');
if ( !is_array($current_exclude) ) {
$current_exclude = array();
}
$query->set('post__not_in', array_merge($current_exclude, $excluded_ids));
}
}
add_action('pre_get_posts', 'exclude_pages_from_search');- Неверный идентификатор страницы: убедитесь, что ID страниц правильные. Можно получить ID через админку или из URL при редактировании.
- Кэширование мешает проверить изменения: отключите кэш или очистите его после внесения изменений.
Практические советы по безопасности и производительности
- Избегайте больших массивов ID в
post__not_in, это может замедлить запросы. - Используйте метаполя для группового управления исключениями — например, ставьте метаполе
exclude_from_search=1на нужные страницы, чтобы не редактировать код при добавлении новых. - Не меняйте запросы в админке (проверка
!is_admin()обязательна). - Если сайт имеет много контента, рассмотрите использование специализированных поисковых решений (например, ElasticSearch), где фильтры настраиваются централизованно.
Сравнение вариантов исключения страниц из поиска
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
Редактирование pre_get_posts в functions.php | Без плагинов, точечный контроль, гибкость | Требует навыков программирования | Малые и средние сайты |
| Плагины типа Search Exclude | Простота, интерфейс для выбора страниц | Дополнительная нагрузка, зависимость от плагина | Для пользователей без навыков кода |
| Использование метаполей с фильтром в запросе | Гибко, централизованное управление через админку | Нужно внедрять код для фильтрации | Большие сайты с множеством исключений |