Диагностика задачи: зачем исключать товары по атрибутам из каталога и поиска
В интернет-магазинах на WooCommerce иногда требуется скрыть определённые товары из стандартного каталога и поиска, не удаляя их из базы. Например, товары с определённым атрибутом «Сезон» = «Архив», или с атрибутом «Статус» = «Снято с производства». Это помогает не показывать устаревшие позиции, но при этом сохранять их для отчетности или внутреннего учета.
По умолчанию WooCommerce не предоставляет гибких настроек для фильтрации товаров по атрибутам вне виджетов фильтрации и категорий, поэтому приходится использовать код для изменения запросов WP_Query.
Как работает исключение: фильтрация главного запроса WooCommerce
Для решения задачи нужно изменить параметры основного WP_Query на страницах каталога и поиска, чтобы исключить товары с заданными атрибутами. Атрибуты в WooCommerce — это таксономии с префиксом pa_. Например, атрибут «Сезон» с ярлыком season будет в таксономии pa_season.
Мы будем использовать хук pre_get_posts для изменения запроса до его выполнения.
Пошаговое решение: исключаем товары с атрибутом из поиска и каталога
add_action('pre_get_posts', function($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
// Проверяем, что это главная страница магазина, архив товаров или поиск
if (is_shop() || is_product_taxonomy() || is_search()) {
// Добавляем фильтрацию по таксономии атрибута
$tax_query = $query->get('tax_query') ?: [];
$tax_query[] = [
'taxonomy' => 'pa_season', // замените на нужный атрибут
'field' => 'slug',
'terms' => ['archive'], // слаг значения атрибута для исключения
'operator' => 'NOT IN',
];
$query->set('tax_query', $tax_query);
}
});В данном примере мы исключаем из каталога и поиска товары с атрибутом pa_season и значением archive.
Как проверить, что исключение сработало
- Откройте страницу магазина или поиска, где ранее отображались товары с атрибутом
archive. - Товары с этим атрибутом не должны отображаться в списке.
- Для дополнительной проверки в админке поищите товар с атрибутом
archiveи убедитесь, что он есть, но не показывается на сайте.
Частые ошибки при реализации и их исправление
- Неверное имя таксономии атрибута
Атрибуты WooCommerce хранятся как таксономии с префиксомpa_. Проверяйте точный слаг атрибута в админке или базе. - Код срабатывает в админке
Обязательно пропускайте запросы в админке с помощьюis_admin(), иначе можно сломать функционал. - Неправильный оператор в
tax_query
Для исключения нужно использоватьNOT IN, иначе товары будут фильтроваться наоборот. - Другие фильтры перекрывают запрос
Если есть другие плагины или темы, которые меняютpre_get_posts, порядок срабатывания может влиять на результат. В этом случае можно добавить приоритет или более точную проверку.
Альтернативы: плагины и код
| Решение | Плюсы | Минусы |
|---|---|---|
Код на pre_get_posts | Гибкость, отсутствие зависимости от плагинов, лёгкость кастомизации | Требует знаний PHP, при ошибках может влиять на запросы |
| Плагин «WooCommerce Product Filter» или аналоги | Простота настройки, визуальные фильтры для пользователей | Может не исключать товары из поиска, нагрузка на сайт |
Чек-лист для внедрения решения
- Определите точный атрибут и значение для исключения (проверьте slug в админке или базе)
- Добавьте код в файл
functions.phpдочерней темы или в кастомный плагин - Убедитесь, что код не срабатывает в админке (
is_admin()) - Проверьте работу на страницах магазина, архивах и поиске
- Проверьте работу на кэшированных страницах (очистите кэш)
- Протестируйте на мобильных устройствах и с разными ролями пользователей
Практические советы по производительности и безопасности
- Избегайте добавления слишком сложных
tax_queryс большим числом условий, это нагрузит базу. - Кэшируйте страницы магазина с помощью плагинов кеширования, чтобы уменьшить нагрузку от запросов.
- Проверяйте совместимость с другими плагинами, которые могут менять запросы WooCommerce.
- Используйте дочерние темы или собственные плагины для хранения кода, чтобы избежать потери при обновлениях.