Проблема: зачем исключать товары из поиска WordPress
По умолчанию WooCommerce добавляет товары в общий поиск WordPress, что не всегда требуется. Например, если на сайте есть блог и магазин, и вы хотите, чтобы поиск по блогу не показывал товары, чтобы не мешать пользователям. Или если используется кастомный поиск, где товары создают лишний шум.
В этом материале разберём, как исключить товары из поиска программно, без использования плагинов, что повышает производительность и прозрачность.
Диагностика проблемы
Для начала проверьте, что товары действительно участвуют в поиске:
- Откройте страницу сайта с поиском.
- Выполните поиск по известному товару.
- Если товар появляется в результатах, значит он учитывается поиском WordPress.
Далее проверим типы записей, которые включены в поиск. В WordPress поиск по умолчанию затрагивает посты и страницы, WooCommerce добавляет товары с типом записи product.
Пошаговое решение: исключаем товары из поиска через фильтр pre_get_posts
Добавим в файл functions.php темы или в отдельный плагин следующий код:
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'];
}
// Исключаем тип 'product'
if ( is_array($post_types) ) {
$post_types = array_diff($post_types, ['product']);
} elseif ( is_string($post_types) && $post_types === 'product' ) {
$post_types = ['post', 'page'];
}
$query->set('post_type', $post_types);
}
}
add_action('pre_get_posts', 'exclude_products_from_search');Этот фильтр отлавливает основной запрос на странице поиска и исключает из параметров поиска тип записи product. Если явно не задан тип записи, он устанавливает поиск по постам и страницам.
Объяснение кода
is_main_query()— проверка, что это основной запрос WordPress.is_search()— условие для поиска.- Получаем текущий параметр
post_typeи исключаемproduct.
Проверка результата после внедрения
- Обновите файл
functions.phpс кодом. - Очистите кеш сайта и браузера.
- Зайдите на страницу поиска и выполните запрос по товару, который раньше показывался.
- Убедитесь, что товара в результатах нет.
- Проверьте, что посты и страницы по-прежнему находятся в выдаче.
Частые ошибки и как их исправить
- Ошибка: товары все еще показываются в поиске.
Причина: возможно, в запросе задан параметрpost_type=productявно где-то в теме или плагине, или кэш не очищен.
Решение: проверьте сторонние фильтры, очистите кеш, попробуйте временно переключиться на стандартную тему. - Ошибка: поиск перестал показывать страницы или посты.
Причина: код заменил параметрpost_typeнекорректно.
Решение: убедитесь, что при удаленииproductиз массива сохраняются другие типы записи, как показано в примере. - Ошибка: код вызывает ошибку PHP.
Причина: синтаксическая ошибка при копировании.
Решение: проверьте синтаксис, используйте IDE или редактор с подсветкой кода.
Практические советы по оптимизации и безопасности
- Используйте дочернюю тему для внедрения изменений, чтобы не потерять их при обновлениях.
- Проверяйте работу кода на тестовом сайте перед применением на боевом.
- Кэширование запросов может мешать моментальному обновлению результатов поиска. Очищайте кеш после внесения изменений.
- Для больших интернет-магазинов исключение товаров из основного поиска может улучшить скорость и релевантность выдачи.
Сравнение подходов: плагин vs код без плагина
| Подход | Плюсы | Минусы |
|---|---|---|
| Использование плагинов (например, Search Exclude) | Простота настройки, интерфейс, дополнительные функции | Дополнительная нагрузка, возможные конфликты, меньше контроля |
| Код через pre_get_posts (как в статье) | Легковесность, полный контроль, нет зависимости от плагинов | Требует навыков программирования, риски ошибок, отсутствие UI |