Проблема: невозможность исключить товар из распродажи стандартными средствами WooCommerce
Во многих интернет-магазинах на WooCommerce возникает задача исключить отдельные товары из общей распродажи. При этом стандартные возможности WooCommerce не позволяют это сделать без установки дополнительных плагинов или кастомных решений. В этой статье разберем, как на уровне кода исключить товар из скидки, сохранив при этом массовую распродажу для остальных товаров.
Диагностика проблемы
Если вы используете массовую распродажу с помощью стандартных акций WooCommerce, то скидка применяется ко всем товарам с установленной ценой со скидкой (sale_price). Однако WooCommerce не предусматривает встроенного способа исключать товары из этих акций по ID или категории.
Основные симптомы:
- Скидка отображается на всех товарах, включая те, которые должны быть исключены;
- Нет опции в админке для исключения отдельных товаров из распродажи;
- Плагины для расширения управления скидками могут быть нежелательны из-за нагрузки или стоимости.
Пошаговое решение: исключение товара из распродажи через фильтр
Используем фильтр WooCommerce woocommerce_product_get_sale_price, который управляет стоимостью распродажи товара. Перехватив вызов, мы можем отменить скидку для нужных товаров.
1. Определите ID или артикул товара, который нужно исключить. Например, $excluded_product_ids = array(123, 456);
2. Добавьте следующий код в файл functions.php активной темы или в кастомный плагин:
add_filter('woocommerce_product_get_sale_price', 'exclude_product_from_sale_price', 10, 2);
function exclude_product_from_sale_price($sale_price, $product) {
$excluded_product_ids = array(123, 456); // Замените на ID ваших товаров
if (in_array($product->get_id(), $excluded_product_ids)) {
return '';// Отменяем цену распродажи
}
return $sale_price;
}
add_filter('woocommerce_product_get_price', 'sync_price_with_sale_exclusion', 10, 2);
function sync_price_with_sale_exclusion($price, $product) {
$excluded_product_ids = array(123, 456);
if (in_array($product->get_id(), $excluded_product_ids)) {
// Если цена распродажи отменена, возвращаем обычную цену
return $product->get_regular_price();
}
return $price;
}3. Очистите кеш WooCommerce и браузера.
Проверка результата после внедрения
Чтобы убедиться, что решение сработало:
- Перейдите на страницу товара, который должен быть исключен из распродажи. Цена должна быть без скидки, даже если у него задана
sale_price. - На странице других товаров, участвующих в распродаже, скидка должна отображаться корректно.
- Проверьте корзину и оформление заказа — цены должны соответствовать отображаемым на витрине.
Частые ошибки и как их исправить
- Кэширование цен: Если используется кеширование (например, через плагин кеша или встроенные механизмы WooCommerce), старые цены могут показываться. Очистите кеш сайта и браузера.
- Неправильные ID товаров: Убедитесь, что в массиве
$excluded_product_idsуказаны именно ID товаров, а не артикулы или другие значения. - Конфликт с другими фильтрами: Если другие плагины или темы изменяют цены через фильтры, может возникнуть конфликт. Проверьте при деактивации сторонних расширений.
- Не применяется в AJAX или корзине: Иногда цены в корзине и мини-корзине кэшируются отдельно. Проверьте работу на всех этапах оформления заказа.
Практические советы по безопасности и производительности
- Не используйте тяжелые плагины для простой задачи исключения товаров из распродажи, это снизит нагрузку.
- Добавляйте исключения в код через ID, а не по категории, если нужно точечно управлять товарами.
- Проводите тест на staging-сервере перед внедрением на рабочем сайте.
- Регулярно обновляйте WooCommerce и тему, чтобы избежать несовместимостей с фильтрами.
Таблица сравнения способов исключения товара из распродажи
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Код на фильтре woocommerce_product_get_sale_price | Легко контролировать, без сторонних плагинов, быстро работает | Требует знаний PHP, не подходит для массового управления | Пример кода из статьи |
| Плагины скидок и акций | Интуитивный интерфейс, много функций | Нагрузка, стоимость, избыточность для простых задач | Advanced Coupons, WooCommerce Dynamic Pricing |
| Использование категорий для исключения | Легко управлять через админку, масштабируемо | Менее гибко, влияет на все товары категории | Удаление категории из акции |