Диагностика проблемы: зачем исключать товары WooCommerce из поиска
Иногда нужно, чтобы товары магазина WooCommerce не отображались в стандартном поиске WordPress — например, если сайт используется и как блог, и как магазин, но поиск должен работать только по статьям и страницам. Без исключения товары будут показываться вместе с обычным контентом, что может запутать пользователей или снизить релевантность результатов.
Пошаговое решение: программное исключение товаров из поиска
Для исключения товаров WooCommerce из поиска нужно модифицировать WP_Query, который формирует результаты поиска. Лучшее место для этого — фильтр pre_get_posts. Ниже пример кода, который надо добавить в файл functions.php вашей темы или в кастомный плагин:
function exclude_woocommerce_products_from_search( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
// Получаем все типы записей, кроме 'product'
$post_types = $query->get('post_type');
if ( empty( $post_types ) || $post_types === 'any' ) {
// По умолчанию WP ищет посты и страницы, исключаем 'product'
$post_types = ['post', 'page'];
} elseif ( is_string( $post_types ) ) {
$post_types = [$post_types];
}
$post_types = array_filter( $post_types, function( $type ) {
return $type !== 'product';
} );
$query->set( 'post_type', $post_types );
}
}
add_action( 'pre_get_posts', 'exclude_woocommerce_products_from_search' );Этот код проверяет, что запрос — главный и это поисковый запрос на фронтенде, затем исключает тип записи product из параметра post_type. Если параметр пуст или равен any, явно устанавливает поиск по post и page.
Альтернативный вариант: использовать параметр post_type напрямую
Если вы хотите добавить в поиск только конкретные типы записей, можно жестко задать их в pre_get_posts:
function restrict_search_to_posts_pages( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'post_type', ['post', 'page'] );
}
}
add_action( 'pre_get_posts', 'restrict_search_to_posts_pages' );Проверка результата после внедрения
- Очистите кеш сайта и браузера.
- Перейдите на страницу поиска и введите запрос, который есть в товарах WooCommerce.
- Убедитесь, что товары не отображаются в результатах поиска, а показываются только записи и страницы.
- Проверьте, что поиск по товарам работает через стандартный каталог WooCommerce (если нужно).
Частые ошибки и как их исправить
- Товары все равно показываются в поиске — возможно, используется плагин для поиска, который игнорирует стандартный WP_Query. Проверьте, не активированы ли сторонние поисковые решения.
- Поиск перестал работать или пустые результаты — проверьте, что в
post_typeпередаются корректные значения. Лучше явно указать массив['post', 'page'], не передаватьany. - Изменения не вступают в силу — очистите кеш, отключите кеширующие плагины и повторите тестирование.
Практические советы по безопасности и производительности
- Изменение поискового запроса через
pre_get_posts— самый легковесный и безопасный способ, не добавляйте лишних запросов к базе. - Не используйте сложные SQL-запросы для фильтрации товаров, если можно обойтись стандартными параметрами WP_Query.
- Тестируйте изменения на стейджинговом сайте, чтобы исключить конфликты с другими плагинами.
- Если у вас активированы кеширующие плагины (например, Clearfy Pro из WPShop), после внесения изменений обязательно очистите кеш.
Сравнение способов исключения товаров из поиска
| Метод | Преимущества | Недостатки |
|---|---|---|
Фильтр pre_get_posts с изменением post_type | Легко реализуется, нативный WP способ, не требует плагинов | Нужна аккуратность, чтобы не сломать другие запросы |
| Плагины для поиска (Relevanssi, SearchWP) | Расширенные возможности поиска и фильтрации | Дополнительные ресурсы, возможные конфликты, необходимость настройки |
| Модификация SQL-запросов напрямую | Максимальный контроль | Сложно поддерживать, риск ошибок, ухудшение производительности |