wpnotes.ru wordpress WP Notes

Как исключить товары WooCommerce из общего поиска WordPress без плагинов

Диагностика проблемы: зачем исключать товары 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' );

Проверка результата после внедрения

  1. Очистите кеш сайта и браузера.
  2. Перейдите на страницу поиска и введите запрос, который есть в товарах WooCommerce.
  3. Убедитесь, что товары не отображаются в результатах поиска, а показываются только записи и страницы.
  4. Проверьте, что поиск по товарам работает через стандартный каталог 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-запросов напрямуюМаксимальный контрольСложно поддерживать, риск ошибок, ухудшение производительности
×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙