Исключение товаров WooCommerce по атрибуту из поиска и категорий

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

В интернет-магазинах на WooCommerce часто возникает задача скрыть из результатов поиска и категорий товары с определёнными атрибутами. Например, товары с атрибутом "Скрытый" или "Только под заказ" не должны отображаться пользователям в общем каталоге, но должны остаться доступными по прямой ссылке.

Без правильной фильтрации эти товары продолжают показываться, что ухудшает UX и может привести к недоразумениям в заказах.

Как проверить, что товары не исключены

  • Выполните поиск по ключевому слову, относящемуся к скрываемому товару.
  • Перейдите в категорию, где должен отображаться товар.
  • Если товар отображается, фильтрация не работает корректно.

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

Для исключения товаров по атрибуту из поиска и архивов категорий WooCommerce обычно используют фильтрацию основного запроса pre_get_posts.

Допустим, у нас есть атрибут с таксономией pa_status, и мы хотим исключить товары с термином skrytyy (slug).

add_action('pre_get_posts', function ($query) {
    if (is_admin() || !$query->is_main_query()) {
        return;
    }

    // Проверяем, что это поиск или архив WooCommerce
    if (($query->is_search() || is_post_type_archive('product') || is_tax('product_cat')) && !is_admin()) {
        // Добавляем таксономию для исключения
        $tax_query = (array) $query->get('tax_query');

        $tax_query[] = [
            'taxonomy' => 'pa_status',
            'field'    => 'slug',
            'terms'    => ['skrytyy'],
            'operator' => 'NOT IN',
        ];

        $query->set('tax_query', $tax_query);
    }
});

Этот код добавляет условие, исключающее товары с термином skrytyy атрибута pa_status из результатов поиска и архивов категорий.

Подключение к functions.php

Вставьте этот код в файл functions.php активной темы или в кастомный плагин. После сохранения изменений нужно очистить кэш сайта и браузера.

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

  • Выполните поиск по товару с атрибутом skrytyy — товар не должен отображаться.
  • Перейдите в категорию, где такой товар есть — он должен отсутствовать в списке.
  • Откройте страницу товара напрямую по URL — товар должен быть доступен.

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

  • Ошибка: Товары не исключаются.
    Причина: Хук pre_get_posts не срабатывает, потому что условие is_main_query() не выполнено или код добавлен в админке.
    Решение: Убедитесь, что код размещён вне админки и что условие is_main_query() используется правильно.
  • Ошибка: Исключаются все товары, а не только с нужным атрибутом.
    Причина: Неправильный таксономический запрос или опечатка в имени таксономии или термина.
    Решение: Проверьте правильность slug атрибута и термина через админку WooCommerce в разделах "Атрибуты" и "Термины".
  • Ошибка: Не исключаются товары на страницах пагинации или в виджетах.
    Причина: Дополнительные запросы могут не использовать основной WP_Query.
    Решение: Для сложных случаев рассмотрите фильтрацию woocommerce_product_query или другие хуки WooCommerce.

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

  • Добавляйте условия фильтрации только для публичного фронтенда, чтобы не влиять на запросы в админке.
  • Используйте кэширование на уровне объекта, чтобы избежать повторных запросов к базе при фильтрации.
  • Перед внесением изменений делайте резервные копии functions.php или используйте дочернюю тему.

Сравнение способов исключения товаров по атрибуту

МетодОписаниеПлюсыМинусы
pre_get_posts + tax_queryФильтрация основного WP_Query в зависимости от атрибутаПростая реализация, не требует плагиновМожет не работать с кастомными запросами WooCommerce
woocommerce_product_queryФильтрация WooCommerce запросов через специальный хукЛучше интеграция с WooCommerce, гибкостьСложнее для новичков, требует понимания WooCommerce API
Плагины фильтрации товаровИспользование готовых решений для управления видимостью товаровУдобство настройки через UIДополнительные нагрузки, может влиять на производительность
Как удалить скрипты и стили WordPress для ускорения сайта
16.12.2025
Как массово удалить неиспользуемые медиа файлы в WordPress
09.12.2025
Оптимизация изображений в WordPress: улучшение скорости и SEO
02.12.2025
Как создать свой плагин WordPress: пошаговое руководство
12.11.2025
Как отключить и удалить Gutenberg в WordPress без оставшегося кода
21.02.2026