Диагностика: почему нужно исключать товары WooCommerce из поиска
По умолчанию WordPress включает все публичные типы записей в результаты стандартного поиска, включая товары WooCommerce (тип записи product). Это может быть нежелательно, если у вас большой ассортимент, и вы хотите отделить поиск по товарам от поиска по контенту сайта (статьям, страницам). Такое разделение улучшает UX и снижает нагрузку на поиск.
Чтобы проверить, участвуют ли товары в поиске, выполните простой тест:
- Откройте стандартную форму поиска WordPress.
- Впишите название известного товара.
- Если в результатах отображается товар, значит он включен в поиск.
Если это нежелательно — нужно исключить товары из поисковой выдачи.
Пошаговое решение: исключение товаров из поиска через функции темы
Самый надежный способ — использовать фильтр pre_get_posts в файле functions.php вашей активной темы или дочерней темы. Он позволяет изменить параметры основного запроса WordPress до выполнения.
Код для исключения товаров WooCommerce из основного поиска:
function exclude_products_from_search( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
// Получаем текущие типы записей для поиска
$post_types = $query->get('post_type');
// Если post_type не установлен, значит поиск по всем публичным типам
if ( empty( $post_types ) ) {
// Исключаем product из поиска
$query->set('post_type', array( 'post', 'page' ));
} elseif ( is_array( $post_types ) ) {
// Если post_type задан массивом, удаляем product из него
$post_types = array_diff( $post_types, array( 'product' ) );
if ( empty( $post_types ) ) {
// Если после удаления ничего не осталось, заменяем на пустой массив, чтобы не искать
$post_types = array( 'post' );
}
$query->set('post_type', $post_types);
} elseif ( $post_types === 'product' ) {
// Если стоит только product, заменяем на post
$query->set('post_type', 'post');
}
}
}
add_action( 'pre_get_posts', 'exclude_products_from_search' );Этот код исключит товары из стандартного поиска, оставив только посты и страницы. Если у вас другие типы записей для поиска, добавьте их в массив post_type.
Как проверить, что решение сработало
- Очистите кеш сайта и браузера.
- Выполните поиск по названию известного товара.
- Товар не должен появляться в результатах.
- Проверьте, что посты и страницы по-прежнему отображаются в поиске.
Частые ошибки при исключении товаров из поиска
- Код добавлен в неподходящее место. Убедитесь, что функция добавлена в
functions.phpактивной темы, а не в плагине, который отключается. - Не проверяется условие
is_search(). Без этого фильтр повлияет на все запросы, включая админку и архивы. - Неправильная работа с параметром
post_type. Если он не массив, используйте соответствующую логику, иначе произойдут ошибки. - Кеширование. Если используется кеширование страниц или поисковых запросов, изменения могут не применяться сразу.
Практические советы по оптимизации и безопасности
- Оптимизация: Исключение товаров из основного поиска уменьшает нагрузку на базу, особенно если у вас много товаров.
- Безопасность: Не используйте прямое SQL вмешательство для исключения товаров — это может привести к уязвимостям.
- Расширяемость: Если в будущем нужно будет искать товары отдельно — создайте отдельную форму поиска с параметром
post_type=product.
Сравнение вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр pre_get_posts (код) | Без плагинов, гибко, контролируемо | Нужен доступ к коду, может ошибиться новичок |
| Плагины (например Search Exclude) | Просто, UI для выбора | Дополнительный плагин, нагрузка, ограничения по настройкам |
| Изменение шаблонов поиска | Тонкая настройка вывода | Сложнее в поддержке, требует PHP навыков |