Проблема: необходимость исключения товаров из отложенных заказов в WooCommerce
В стандартном функционале WooCommerce нет возможности исключить определённые товары из отложенных заказов (по сути - корзин или сохранённых для последующего оформления). Это затрудняет управление ассортиментом и акции для товаров, которые нельзя «отложить» или сохранить, например, товары с ограниченным сроком действия, услуги или эксклюзивные позиции.
Диагностика проблемы
Чтобы понять, что товары не исключаются из отложенных заказов, нужно проверить следующий сценарий:
- Добавьте в корзину товар, который хотите исключить из отложенных заказов.
- Попробуйте сохранить корзину или добавить товар в отложенные.
- Убедитесь, что товар действительно сохраняется (отложенный заказ создаётся) — это свидетельствует о том, что WooCommerce не фильтрует такие позиции.
Если вы используете сторонний плагин для отложенных заказов (wishlist, save for later), нужно проверить документацию плагина, поддерживает ли он фильтрацию товаров.
Пошаговое решение: исключение товаров из отложенных заказов через код
В этом примере рассмотрим, как можно запретить добавление товаров с определённым тегом «no-wishlist» в отложенные заказы, используя хук WooCommerce, который отвечает за добавление в корзину или сохранение.
Шаг 1. Добавьте метку (тег) товара
В админке WooCommerce перейдите в карточку товара и добавьте тег no-wishlist для тех товаров, которые необходимо исключить.
Шаг 2. Запретите добавление таких товаров в отложенные
Добавьте следующий код в файл functions.php активной темы или в плагин для кастомных функций:
add_filter('woocommerce_add_to_wishlist_validation', 'exclude_products_from_wishlist', 10, 3);function exclude_products_from_wishlist($valid, $product_id, $user_id) { $product = wc_get_product($product_id); if (!$product) { return $valid; } $terms = wp_get_post_terms($product_id, 'product_tag', array('fields' => 'slugs')); if (in_array('no-wishlist', $terms)) { wc_add_notice(__('Этот товар нельзя отложить.'), 'error'); return false; } return $valid;}Примечание: фильтр woocommerce_add_to_wishlist_validation
Шаг 3. Проверка работы кода
- Очистите кеш страниц и браузера.
- Попробуйте добавить товар с тегом
no-wishlistв отложенные. - Должно появиться сообщение об ошибке и товар не добавится.
- Для обычных товаров добавление должно работать.
Альтернативы: плагины и код — сравнительная таблица
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php | Прямой контроль, нет дополнительных плагинов, гибкость | Нужно учитывать конкретный плагин для отложенных, требует правок при смене плагина |
| Плагин с фильтрами (например YITH Wishlist) | Простота установки, поддержка обновлений, дополнительные функции | Может не поддерживать нужную фильтрацию, нагрузка на сайт |
Частые ошибки и как их исправить
- Хук не срабатывает: используйте правильный фильтр, соответствующий вашему плагину отложенных заказов. Проверьте документацию плагина.
- Ошибка отсутствует, но товар добавляется: убедитесь, что тег
no-wishlistправильно добавлен и совпадает с тем, что проверяется в коде. - Сообщение об ошибке не выводится: используйте
wc_add_notice()и убедитесь, что в шаблоне выводятся уведомления WooCommerce.
Проверка результата после внедрения
Чтобы убедиться, что решение работает:
- Войдите под обычным пользователем.
- Перейдите к товару с тегом
no-wishlist. - Попробуйте добавить его в отложенные заказов.
- Убедитесь, что появляется сообщение об ошибке и товар не добавляется.
- Проверьте добавление другого товара без тега — он должен успешно добавиться.
Практические советы по безопасности и производительности
- При добавлении кастомных функций всегда проверяйте, что код не вызывает ошибок PHP, используйте отладку.
- Кэширование страниц может мешать проверке уведомлений — очищайте кеш при тестировании.
- Минимизируйте обращение к базе данных, например, кешируйте результаты
wp_get_post_termsпри необходимости. - Если используете сторонние плагины для отложенных заказов, регулярно обновляйте их для безопасности.