Диагностика проблемы: почему нужно исключать товары из каталога по атрибуту
Часто в интернет-магазинах на WooCommerce возникает задача скрыть из публичного каталога товары с определёнными характеристиками — например, товары, которые не продаются в конкретном регионе, сезонные товары или продукты с ограничениями. При этом важно не удалять товар из базы, чтобы сохранить статистику и возможность редактирования.
Без использования плагинов это можно сделать, применив фильтрацию запроса товаров в каталоге по определённому атрибуту или мета-данным.
Как проверить, что товар имеет нужный атрибут
Для начала убедитесь, что товары имеют нужный атрибут. Перейдите в админке WooCommerce в карточку товара, и проверьте, установлен ли атрибут, например Скрыть из каталога с значением Да.
Атрибуты в WooCommerce хранятся как таксономии. Например, «pa_hide-from-catalog» — префикс pa_ плюс слаг атрибута. Чтобы узнать точный слаг, перейдите в Товары > Атрибуты и найдите нужный.
Пошаговое решение: код для исключения товаров из каталога по атрибуту
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомных функций:
add_action('pre_get_posts', 'exclude_products_by_attribute_from_shop');
function exclude_products_by_attribute_from_shop($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
// Проверяем, что это каталог WooCommerce или главная страница магазина
if ($query->is_post_type_archive('product') || $query->is_tax('product_cat') || $query->is_shop()) {
// ID термина атрибута, который нужно исключить
$excluded_term_slug = 'da'; // слаг значения атрибута
$attribute_taxonomy = 'pa_hide-from-catalog'; // слаг атрибута
// Добавляем параметр таксономии в запрос
$tax_query = (array) $query->get('tax_query');
$tax_query[] = array(
'taxonomy' => $attribute_taxonomy,
'field' => 'slug',
'terms' => array($excluded_term_slug),
'operator' => 'NOT IN',
);
$query->set('tax_query', $tax_query);
}
}Объяснение:
pre_get_postsизменяет основной WP_Query для каталога товаров.- Проверяем, что это фронтенд и именно запрос каталога или категории товаров.
- Добавляем условие
tax_query, исключающее товары с атрибутомhide-from-catalog=da.
Проверка результата после внедрения
- Очистите кэш сайта и браузера.
- Перейдите на страницу магазина или категорию товаров.
- Убедитесь, что товары с атрибутом
Скрыть из каталога = Дане отображаются. - Для проверки можно временно снять атрибут с товара и обновить страницу — товар должен появиться.
Частые ошибки и как их исправить
- Товары не скрываются: Проверьте правильность слага атрибута и значения. В админке атрибуты и термины чувствительны к регистру.
- Код не работает на страницах пагинации: Убедитесь, что проверяется
is_main_query()и что кэш очищен. - Код влияет на админку: В коде предусмотрена проверка
is_admin(), не удаляйте её. - Другие фильтры конфликтуют: Проверьте другие плагины и коды, которые могут менять запрос товаров.
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
- Проверяйте производительность сайта после внедрения — фильтрация по таксономиям обычно не замедляет запросы, но с большими базами стоит контролировать.
- Используйте транзиенты или кэширование, если каталог очень большой и нагрузка возрастает.
Сравнение вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php (как в статье) | Нет зависимостей, гибкость, контроль | Требует технических навыков |
| Плагины для фильтрации товаров | Простота установки, дополнительные функции | Могут замедлять сайт, зависимость от поддержки |
| Ручное снятие видимости товара (статус) | Простота, не требует кода | Не автоматизировано, сложно при большом каталоге |