WooCommerce: как исключить товары по атрибутам из поиска и архива

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

В WooCommerce иногда возникает задача скрыть из результатов поиска и архива определённые товары по атрибутам. Например, товары с атрибутом «Скрыть из поиска» или с определённой категорией могут быть неактуальны для пользователей или предназначены только для внутреннего использования. По умолчанию WooCommerce не предоставляет настроек для фильтрации товаров по атрибутам в поиске и архивах, поэтому приходится делать это программно.

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

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

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

1. Узнаём slug атрибута и значение

Перейдите в WooCommerce > Товары > Атрибуты. Найдите нужный атрибут, например, hide_from_search. Значения атрибута можно посмотреть при редактировании или добавлении товара.

2. Добавляем фильтр в functions.php или в кастомный плагин

Используем хук pre_get_posts, чтобы модифицировать запрос и исключить товары с нужным атрибутом.

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

    // Применяем только на поиске и архивах товаров
    if (($query->is_search() || is_post_type_archive('product') || is_tax('product_cat') || is_tax('product_tag')) ) {
        // Параметры атрибута
        $taxonomy = 'pa_hide_from_search'; // slug атрибута с префиксом pa_
        $term_slug = 'yes'; // значение атрибута, исключаемое из вывода

        $tax_query = $query->get('tax_query');
        if (!is_array($tax_query)) {
            $tax_query = [];
        }

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

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

3. Проверяем работу фильтра

Очистите кэш сайта и браузера. Зайдите на страницу поиска и выполните поиск по товару с атрибутом hide_from_search = yes. Такой товар не должен отображаться. Аналогично проверьте страницы архива.

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

  • Создайте тестовый товар с атрибутом hide_from_search = yes.
  • Перейдите на страницу поиска — товар не должен появляться.
  • Перейдите в категории и теги — товар также не должен отображаться.
  • Проверьте другие товары без такого атрибута — они должны быть видны.

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

  • Неправильный slug атрибута: Атрибуты товаров в WooCommerce хранятся как таксономии с префиксом pa_. Проверьте правильный slug через админку (например, pa_hide_from_search).
  • Неправильное значение термина: Значение атрибута должно совпадать со slug термина, а не с его названием.
  • Фильтр применяется в админке: Добавьте проверку is_admin(), чтобы исключить применение фильтра в административной части.
  • Конфликты с плагинами кэширования: Очистите кэш и отключите сторонние плагины кэширования для теста.
  • Фильтр не применился из-за других таксономий: Используйте 'relation' => 'AND' в tax_query для точного комбинирования условий.

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

  • Добавляйте фильтр только на фронтенде и для главного запроса, чтобы избежать лишних расходов ресурсов.
  • Если атрибутов много, используйте кеширование результатов или transient для уменьшения нагрузки.
  • Тестируйте изменения на staging-сервере, чтобы избежать проблем на живом сайте.
  • Регулярно обновляйте WooCommerce и тему, чтобы избежать несовместимостей с функциями фильтрации.

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

МетодПлюсыМинусыПример
Код на pre_get_postsГибко, бесплатно, без плагиновТребует знаний PHP, может конфликтовать с темойВыше в статье
Плагин фильтрации выдачи (например, Search Exclude)Простой в настройке, UIМожет тормозить, меньше контроляSearch Exclude
Настройка видимости товара через статусПросто скрыть товар полностьюНе подходит для выборочной фильтрации по атрибутамМеняем статус товара на "черновик"
Оценка и отзывы в WordPress: настройка и примеры реализации
01.02.2026
WordPress: как создать и использовать собственные таксономии
18.01.2026
Как использовать WPRemark для автоматического ответа на комментарии в WordPress
18.03.2026
Как добавить дополнительное поле в форму регистрации WordPress с примером кода
30.12.2025
Как избежать конфликтов между плагинами WordPress
04.01.2026