Диагностика проблемы: почему нужно исключать товары из распродажи
В магазине на WooCommerce иногда возникает задача — оставить скидки только на часть каталога, а некоторые товары не должны попадать под распродажу, даже если глобальная скидка установлена.
Например, у вас есть акция на все товары, но определённые бренды или категории должны продаваться по обычной цене. В стандартном функционале WooCommerce нет простой настройки для исключения отдельных товаров из распродажи, что приводит к необходимости искать кастомные решения.
Шаги решения: фильтрация распродаж через код
1. Использование хука woocommerce_get_sale_price для отключения скидки
Хук woocommerce_get_sale_price применяется для получения цены со скидкой. Можно на лету вернуть false для определённых товаров, чтобы они не считались распроданными.
add_filter('woocommerce_get_sale_price', 'exclude_product_from_sale_price', 10, 2);
function exclude_product_from_sale_price($sale_price, $product) {
// Массив ID товаров для исключения из распродажи
$excluded_ids = array(123, 456, 789);
if (in_array($product->get_id(), $excluded_ids)) {
return false; // Отключаем скидку
}
return $sale_price;
}2. Аналогично, исключаем товар из отображения на странице магазина
Чтобы цена без скидки отображалась корректно, добавим фильтр на получение цены:
add_filter('woocommerce_get_price_html', 'show_regular_price_for_excluded_products', 10, 2);
function show_regular_price_for_excluded_products($price_html, $product) {
$excluded_ids = array(123, 456, 789);
if (in_array($product->get_id(), $excluded_ids)) {
$regular_price = wc_price($product->get_regular_price());
return $regular_price; // Показываем обычную цену
}
return $price_html;
}Проверка результата после внедрения
1. Очистите кэш сайта и браузера.
2. Перейдите на страницу товара из списка исключённых (ID 123, 456, 789 в примере).
3. Убедитесь, что на странице товара и в каталоге отображается только обычная цена без скидки.
4. Проверьте, что остальные товары с распродажей показывают корректную цену со скидкой.
Частые ошибки и как их исправить
- Кэширование цен. Если используется кэширование (например, плагин кэширования или серверный кеш), обновления цен могут не отображаться сразу. Очистите кэш или временно отключите кэширование при тестах.
- Использование неправильных ID товаров. Проверьте, что в массиве
$excluded_idsдействительно указаны правильные ID товаров. Их можно узнать в админке WordPress в списке товаров. - Конфликты с другими плагинами. Некоторые плагины для скидок могут переопределять цены после наших фильтров. В этом случае нужно изучить их документацию и возможно использовать другие хуки.
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или в отдельный плагин, чтобы избежать потери изменений при обновлении темы.
- Минимизируйте количество проверок в фильтрах. Если список исключённых товаров большой, лучше хранить ID в опции или таксономии для более удобного управления.
- Для больших магазинов рассмотрите кеширование результатов фильтрации, чтобы не нагружать сервер.
Сравнение подходов: плагин vs кастомный код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, WooCommerce Dynamic Pricing) | Готовые настройки, удобный интерфейс, поддержка скидок разного типа | Может быть тяжёлым, не всегда гибким для точечных исключений, дополнительные расходы |
| Кастомный код (фильтры и хуки) | Лёгкий, гибкий, без дополнительных плагинов, точечное решение | Требует базовых знаний PHP, возможны конфликты с другими плагинами, нужно поддерживать самостоятельно |