Диагностика проблемы: почему нужно удалять разделы товаров WooCommerce
В интернет-магазинах на WooCommerce иногда возникает необходимость убрать определённые категории (разделы) товаров из публичного каталога, поиска и виджетов. Это может быть связано с временной недоступностью товаров, сезонными акциями или внутренними ограничениями. Часто пользователи пытаются сделать это через плагины, которые могут замедлять сайт или приводить к конфликтам. В данной статье рассмотрим, как решить задачу программно, без сторонних расширений.
Пошаговое решение: исключение категорий товаров из вывода
1. Исключение категорий из каталога и поиска
WooCommerce использует стандартный WordPress-запрос pre_get_posts для вывода товаров. Чтобы исключить товары определённых категорий, нужно изменить параметры запроса.
function exclude_product_categories_from_shop_and_search( $query ) {
if ( ! is_admin() && $query->is_main_query() ) {
if ( is_shop() || is_product_category() || is_search() ) {
// Список slug категорий для исключения
$excluded_cats = array( 'skidka', 'rasprodazha' );
$tax_query = (array) $query->get( 'tax_query' );
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $excluded_cats,
'operator' => 'NOT IN',
);
$query->set( 'tax_query', $tax_query );
}
}
}
add_action( 'pre_get_posts', 'exclude_product_categories_from_shop_and_search' );Этот код нужно добавить в файл functions.php вашей темы или в кастомный плагин. Он исключит категории с ярлыками skidka и rasprodazha из страниц магазина и поиска.
2. Удаление категорий из виджетов WooCommerce
По умолчанию виджет категорий WooCommerce не учитывает фильтры запроса. Для исключения категорий из виджета можно использовать фильтр woocommerce_product_categories_widget_args:
function exclude_categories_from_widget( $args ) {
$excluded_cats = array( 'skidka', 'rasprodazha' );
if ( ! isset( $args['exclude'] ) ) {
$args['exclude'] = '';
}
$excluded_slugs = implode( ',', $excluded_cats );
if ( $args['exclude'] ) {
$args['exclude'] .= ',' . $excluded_slugs;
} else {
$args['exclude'] = $excluded_slugs;
}
return $args;
}
add_filter( 'woocommerce_product_categories_widget_args', 'exclude_categories_from_widget' );Проверка результата после внедрения
- Перейдите на страницу магазина (Shop) и убедитесь, что товары из категорий
skidkaиrasprodazhaне отображаются. - Выполните поиск товаров, убедитесь, что товары из исключённых категорий отсутствуют в результатах.
- Проверьте виджет категорий WooCommerce на боковой панели — указанные категории должны отсутствовать.
- Для контроля можно временно вывести SQL-запросы или использовать Debug Bar для проверки изменения параметров основного запроса.
Частые ошибки и их исправление
- Код не работает на страницах с кэшированием. Решение: очистите кэш сайта и браузера, временно отключите кэш-плагины, чтобы проверить изменения.
- Категории не исключаются из виджета. Проверьте, что виджет не настроен на показ всех категорий, и фильтр
woocommerce_product_categories_widget_argsкорректно подключён. - Неправильно указаны ярлыки категорий. Проверьте slug категорий в разделе Товары → Категории в админке WooCommerce.
- Код добавлен в дочернюю тему, но тема не активна. Проверьте, что активна именно та тема, в
functions.php
Практические советы по безопасности и производительности
- Используйте фильтры WordPress и WooCommerce для решения задач, избегайте прямых SQL-запросов — так не нарушается безопасность и совместимость.
- Кэширование: если используете серверный кэш или CDN, настройте исключения для страниц магазина, чтобы изменения отображались мгновенно.
- Всегда тестируйте изменения на staging-сайте перед продакшеном.
- Включите WP_DEBUG и используйте инструменты для отладки запросов, например Query Monitor, чтобы контролировать работу фильтров.
Сравнение способов исключения категорий товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php с фильтром pre_get_posts | Лёгкий, не требует плагинов, гибкий | Требует базовых знаний PHP и WordPress API |
| Использование плагинов для скрытия категорий | Простота настройки через интерфейс | Может замедлить сайт, конфликты с другими плагинами |
| Изменение шаблонов темы | Полный контроль над выводом | Сложно поддерживать при обновлениях темы |