Диагностика задачи: зачем исключать товары по атрибутам
В интернет-магазинах на WooCommerce часто возникает необходимость скрыть из каталога или поиска товары с определёнными атрибутами — например, товары с пометкой «Скрытый», «Распродажа» или «Закрытая коллекция». По умолчанию WooCommerce не предоставляет простой настройки для такой фильтрации, поэтому приходится вмешиваться в запросы WordPress.
Задача: исключить из результатов каталога и поиска все товары, у которых задан определённый атрибут (например, цвет «Черный» или статус «Скрытый»). При этом товары должны оставаться доступными по прямой ссылке.
Как проверить, что товары не фильтруются
- Откройте страницу магазина и поиск по сайту.
- Проверьте наличие товаров с нужным атрибутом в результатах.
- Убедитесь, что по прямой ссылке на товар он открывается корректно.
Решение: фильтрация запросов WooCommerce по атрибутам товаров
Чтобы исключить товары с определённым атрибутом, нужно использовать хук pre_get_posts WordPress и дополнительно подстроить WP_Query для товаров WooCommerce.
1. Получаем ID термина атрибута
Для фильтрации по атрибутам WooCommerce использует таксономии вида pa_{slug}. Например, атрибут «Цвет» с ярлыком color будет таксономией pa_color.
Сначала нужно получить ID термина, который хотим исключить:
$term = get_term_by( 'slug', 'chernyj', 'pa_color' );
if ( ! $term ) {
return; // термин не найден
}
$term_id = $term->term_id;2. Фильтрация основного запроса
Добавьте следующий код в functions.php вашей темы или в отдельный плагин:
add_action('pre_get_posts', 'exclude_products_by_attribute');
function exclude_products_by_attribute( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
// Применяем только к архиву товаров и поиску
if ( ( is_post_type_archive( 'product' ) || is_search() ) ) {
$tax_query = (array) $query->get( 'tax_query' );
// Получаем ID термина
$term = get_term_by( 'slug', 'chernyj', 'pa_color' );
if ( ! $term ) {
return;
}
// Добавляем условие исключения товаров с данным атрибутом
$tax_query[] = array(
'taxonomy' => 'pa_color',
'field' => 'term_id',
'terms' => array( $term->term_id ),
'operator' => 'NOT IN',
);
$query->set( 'tax_query', $tax_query );
}
}Проверка результата после внедрения
- Очистите кеш сайта и браузера.
- Перейдите на страницу каталога WooCommerce — товары с атрибутом «черный» должны исчезнуть из списка.
- Выполните поиск по сайту с запросом, который обычно возвращал товары с этим атрибутом — они не должны отображаться.
- Проверьте прямую ссылку на товар с данным атрибутом — он должен открываться без изменений.
Частые ошибки и как их исправить
- Товары не скрываются: Проверьте правильность таксономии атрибута (должна быть
pa_slug). Используйтеvar_dump(get_taxonomies())для проверки. - Код не работает в админке или на других типах страниц: Не забудьте проверять
is_admin()иis_main_query(), чтобы не ломать запросы в админке. - Появляются ошибки таксономии: Убедитесь, что атрибут зарегистрирован и термин существует.
- Кэширование мешает проверить изменения: Отключите плагины кеширования или очистите кеш после внесения изменений.
Практические советы по производительности и безопасности
- Не добавляйте сложные фильтры в
pre_get_postsбез условий — это может замедлить работу сайта. - Сохраняйте ID терминов в transient или опциях, если фильтрация выполняется часто, чтобы уменьшить число запросов к базе.
- Тестируйте код на staging-сервере перед внедрением на рабочий сайт.
Альтернативные способы: плагин vs код
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Код в functions.php | Полный контроль, без лишних плагинов | Требует знаний, возможны ошибки при обновлениях | Идеально для разработчиков, умеющих работать с WP_Query |
| Плагин фильтрации товаров (напр. WooCommerce Product Filter) | Простой интерфейс, дополнительные функции | Часто платные, могут влиять на скорость | Подходит для магазинов без разработчика |