wpnotes.ru wordpress WP Notes

Исключение товаров WooCommerce из общего поиска WordPress: пошаговое руководство

Диагностика проблемы: почему нужно исключать товары из поиска WordPress

По умолчанию WordPress ищет по всем публичным типам записей, включая товары WooCommerce (post_type = product). Это может быть нежелательно, если на сайте есть блог или другие разделы, где поиск должен работать отдельно от каталога товаров. Например, поиск по блогу не должен показывать товары, чтобы не путать пользователей.

Как проверить текущий поиск

Для диагностики откройте страницу поиска, например, https://site.ru/?s=keyword. Посмотрите, какие записи выводятся. Если там есть товары, значит WooCommerce участвует в общем поиске WordPress.

Пошаговое решение: исключаем товары из поиска

Для изменения поведения поиска нужно использовать хук pre_get_posts. Добавим фильтр в файл functions.php активной темы или в плагин сайта:

add_action('pre_get_posts', function($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') {
            $post_types = ['post', 'page']; // указать нужные типы
        } elseif (is_string($post_types)) {
            $post_types = [$post_types];
        }
        $post_types = array_diff($post_types, ['product']);
        $query->set('post_type', $post_types);
    }
});

Объяснение:

  • Проверяем, что это основной запрос и это фронтенд поиск.
  • Получаем текущие типы записей для поиска.
  • Если не указаны, выставляем по умолчанию post и page.
  • Удаляем из массива тип product.
  • Устанавливаем обновленный список типов обратно в запрос.

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

  • Очистите кеш сайта и браузера.
  • Выполните поиск по сайту, используя ключевые слова, которые встречаются в товарах.
  • Убедитесь, что товары не отображаются в результатах.
  • Проверьте, что поиск по другим типам записей (постам/страницам) продолжает работать.

Частые ошибки и как их исправить

  • Не работает фильтр: возможно, другой плагин или тема перекрывают запрос. Проверьте порядок подключения и попробуйте увеличить приоритет хука: add_action('pre_get_posts', ..., 20);.
  • Появляются пустые результаты: убедитесь, что указаны правильные типы записей в $post_types. Например, если у вас есть кастомные типы, добавьте их явно.
  • Исключение товаров не применяется в виджетах поиска или кастомных формах: убедитесь, что там используется основной WP_Query или реализуйте аналогичный фильтр.

Практические советы по производительности и безопасности

  • Фильтр pre_get_posts работает на уровне запросов к базе, поэтому исключение ненужных типов записей снижает нагрузку.
  • Не используйте в фильтре тяжелые функции и запросы.
  • Всегда проверяйте is_main_query(), чтобы не менять административные запросы и запросы других плагинов.

Сравнение вариантов решения

МетодОписаниеПлюсыМинусы
Фильтр pre_get_posts Изменяет WP_Query на уровне ядра Гибко, без плагинов, контролируемо Требует знаний PHP, может конфликтовать с другими фильтрами
Плагин для кастомизации поиска Готовые решения с настройками (например, SearchWP) Удобно, расширенные возможности поиска Платно, дополнительная нагрузка
Создание отдельной поисковой формы для товаров Отдельный поиск на основе WP_Query с post_type=product Четкое разделение поиска Дополнительная разработка интерфейса

Дополнительный пример: исключение других типов записей

Если нужно исключить из поиска сразу несколько типов, например, product и portfolio, модифицируйте код так:

add_action('pre_get_posts', function($query) {
    if (!is_admin() && $query->is_main_query() && $query->is_search()) {
        $exclude_types = ['product', 'portfolio'];
        $post_types = $query->get('post_type');
        if (empty($post_types) || $post_types === 'any') {
            $post_types = ['post', 'page'];
        } elseif (is_string($post_types)) {
            $post_types = [$post_types];
        }
        $post_types = array_diff($post_types, $exclude_types);
        $query->set('post_type', $post_types);
    }
});
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше