Диагностика проблемы: почему нужно исключать товары из поиска WordPress
По умолчанию WordPress включает все типы записей, включая товары WooCommerce, в результаты поиска. Это не всегда удобно: товары могут засорять общие поисковые выдачи блога или страниц с контентом. Особенно это актуально для сайтов с большим каталогом товаров и активным блогом, где поиск должен работать только по статьям или определённым типам записей.
Основная задача — ограничить поисковый запрос только нужными типами записей, исключив при этом товары WooCommerce (post_type = 'product').
Пошаговое решение: как исключить товары WooCommerce из поиска
1. Фильтрация запроса поиска через хук pre_get_posts
Самый надёжный способ — перехватить основной запрос поиска и изменить параметры так, чтобы товары WooCommerce в него не попадали.
function exclude_products_from_search( \WP_Query $query ) {
if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
// Получаем текущие типы записей для поиска
$post_types = $query->get('post_type');
// Если типы записей не заданы, по умолчанию ищем по 'post' и 'page'
if ( empty($post_types) ) {
$post_types = ['post', 'page'];
}
// Если типы записей — строка, преобразуем в массив
if ( is_string($post_types) ) {
$post_types = [$post_types];
}
// Исключаем 'product' из поиска
$post_types = array_filter($post_types, function($type) {
return $type !== 'product';
});
// Если после фильтрации нет типов, задаём 'post' по умолчанию
if ( empty($post_types) ) {
$post_types = ['post'];
}
$query->set('post_type', $post_types);
}
}
add_action('pre_get_posts', 'exclude_products_from_search');2. Проверка, что товары точно не участвуют в поиске
После добавления кода в functions.php темы или в кастомный плагин, очистите кэш сайта и браузера. Затем выполните поиск по ключевым словам, которые есть в названиях товаров. Если товары не отображаются — решение работает.
Как проверить результат после внедрения
- Выполните поиск по сайту через стандартную форму поиска.
- Запишите ключевые слова, которые есть в названиях товаров и статей.
- Сравните результаты с и без внедрённого кода.
- Проверьте, что в результатах нет страниц с
post_type = 'product'. - Проверьте работу поиска в админ-панели — там поведение не должно измениться.
Частые ошибки при исключении товаров из поиска WooCommerce
- Код добавлен неправильно или в неподходящее место. Добавляйте код в
functions.phpдочерней темы или в собственный плагин, чтобы избежать потери при обновлениях. - Неправильная проверка в условии
pre_get_posts. Обязательно используйте!is_admin()и$query->is_main_query(), чтобы не влиять на запросы в админке или дополнительные запросы. - Игнорирование типа записи в запросе. Если в теме или плагинах уже изменён параметр
post_typeв поиске, фильтр может не сработать без дополнительной отладки. - Неочищенный кэш сайта. После изменения кода всегда очищайте кеш, иначе результат не обновится.
Практические советы по безопасности и производительности
- Используйте фильтр
pre_get_posts, а не прямое изменение SQL-запроса, чтобы не ломать внутреннюю логику WordPress. - Минимизируйте количество вызовов и проверок условий, чтобы не замедлять загрузку страниц.
- Если у вас много типов записей, явно задавайте массив нужных типов, чтобы избежать ошибок.
- При использовании плагинов-кэшей (например, WP Super Cache, W3 Total Cache) не забудьте очистить кэш после внесения изменений.
Сравнение вариантов исключения товаров из поиска
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук pre_get_posts | Изменение параметров основного поискового запроса | Чистый, официальный метод; не ломает логику WP; гибкий | Требует понимания WP_Query; нужно правильно писать условия |
Изменение SQL-запроса через posts_where | Фильтрация на уровне SQL | Можно точечно контролировать запрос | Сложнее поддерживать; риск ошибок и проблем с плагинами |
| Использование плагинов для управления поиском | Готовые решения с настройками | Удобно для новичков; быстро | Дополнительная нагрузка; часто избыточные возможности |
Дополнительные рекомендации
- Если поиск должен работать только по блогу, можно явно задать
post_type => ['post']. - В больших проектах с WPML или Polylang учитывайте языковые параметры в запросах.
- Для комплексных настроек поиска рассмотрите WPSearch или SearchWP, но с ограничением по товарам используйте описанный код.