Диагностика проблемы: зачем исключать товары по атрибутам
В интернет-магазинах на 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 | Дополнительные нагрузки, может влиять на производительность |