Диагностика проблемы: зачем исключать товары из корзины и поиска
В некоторых проектах на WooCommerce возникает необходимость автоматически исключать определённые товары из корзины и/или результатов поиска. Это может быть связано с временным отсутствием товара, специальными акциями или ограничениями по категориям. Без правильной настройки пользователь может добавить такой товар в корзину или найти его через поиск, что негативно влияет на UX и продажи.
Как исключить товары из корзины автоматически
Для удаления товаров из корзины по определённым условиям (например, по категории) используйте хук woocommerce_check_cart_items. Он срабатывает перед оформлением заказа и позволяет проверить содержимое корзины.
Пример кода для исключения товаров из категории excluded-category из корзины:
add_action('woocommerce_check_cart_items', function() {
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product_id = $cart_item['product_id'];
if (has_term('excluded-category', 'product_cat', $product_id)) {
WC()->cart->remove_cart_item($cart_item_key);
wc_add_notice('Товар "' . get_the_title($product_id) . '" был удалён из корзины, так как не доступен для продажи.', 'error');
}
}
});Как это работает
- Проходим по всем товарам в корзине.
- Проверяем, принадлежит ли товар к категории
excluded-category. - Если да — удаляем товар из корзины и выводим уведомление.
Как исключить товары из результатов поиска WooCommerce
Для исключения товаров из поиска используйте фильтр pre_get_posts, чтобы модифицировать основной запрос WordPress на страницах поиска WooCommerce.
add_action('pre_get_posts', function($query) {
if (!is_admin() && $query->is_main_query() && $query->is_search() && is_post_type_archive('product') || $query->get('post_type') === 'product') {
$tax_query = (array) $query->get('tax_query');
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array('excluded-category'),
'operator' => 'NOT IN',
);
$query->set('tax_query', $tax_query);
}
});Пояснения к коду
- Проверяем, что это фронтенд, основной запрос и поиск по товарам.
- Добавляем условие исключения товаров из категории
excluded-categoryиз результатов поиска.
Проверка результата после внедрения
- Добавьте в корзину товар из категории
excluded-category. При переходе к оформлению заказа товар должен автоматически удалиться с сообщением об ошибке. - Выполните поиск по сайту по товарам из категории
excluded-category. Они не должны отображаться в результатах поиска.
Частые ошибки и способы их исправления
- Код не срабатывает: Проверьте, что код добавлен в файл
functions.phpактивной темы или в кастомный плагин, и что WooCommerce активен. - Уведомления не отображаются: Убедитесь, что тема поддерживает вывод уведомлений WooCommerce
wc_print_notices()в шаблонах. - Поиск не фильтруется: Проверьте условия в
pre_get_postsи корректность слага категории.
Практические советы по безопасности и производительности
- Используйте существующие таксономии и категории для исключения товаров, избегайте прямого сравнения ID для лучшей масштабируемости.
- Не добавляйте тяжелые запросы или циклы в хук
woocommerce_check_cart_items, чтобы не замедлять оформление заказа. - Проверяйте работу кода на тестовом сайте перед публикацией в продакшн.
Сравнение способов решения задачи
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код в functions.php | Легко кастомизировать, бесплатно, быстро работает | Требует навыков PHP, возможны ошибки при обновлениях | Небольшие проекты, при отсутствии плагинов |
| Плагины (например, WooCommerce Catalog Mode) | Простота настройки, дополнительные функции | Может замедлять сайт, требует обновления | Большие магазины с нестандартной логикой |