Диагностика задачи: почему автоматизация изменения цен важна
В интернет-магазинах на WooCommerce часто приходится вручную менять цены товаров при распродажах. Это неудобно и приводит к ошибкам, особенно если товаров много. Автоматическое применение скидок позволяет быстро адаптировать цены и избежать потерь из-за человеческого фактора.
Основная задача — изменить цену товара динамически, используя встроенные хуки WooCommerce, чтобы скидка применялась только в нужном промежутке времени или при определённых условиях.
Какие хуки WooCommerce подходят для изменения цены
Для изменения цены товара в WooCommerce без изменения в базе данных обычно используются фильтры:
woocommerce_get_price— фильтр для получения базовой цены (обычной цены товара).woocommerce_get_sale_price— фильтр для получения цены со скидкой.woocommerce_product_get_priceиwoocommerce_product_get_sale_price— фильтры, применяемые к объекту товара (WC_Product).
В большинстве случаев лучше работать с woocommerce_product_get_price, так как он универсален и работает с объектом товара.
Пошаговое решение: автоматическое изменение цены с помощью хука
1. Определение условий распродажи
Например, пусть скидка 20% действует с 1 по 7 июля. Применим скидку только в этот период.
2. Добавление фильтра для изменения цены
add_filter('woocommerce_product_get_price', 'apply_custom_sale_price', 10, 2);
function apply_custom_sale_price($price, $product) {
$start_date = strtotime('2024-07-01');
$end_date = strtotime('2024-07-07 23:59:59');
$now = current_time('timestamp');
// Проверяем, что сейчас в период распродажи
if ($now >= $start_date && $now <= $end_date) {
// Применяем скидку 20% только к товарам с базовой ценой больше 0
if ($price > 0) {
$discounted_price = $price * 0.8;
return round($discounted_price, wc_get_price_decimals());
}
}
return $price;
}Это простая реализация, которая не меняет цену в базе, а возвращает изменённую цену при выводе.
3. Дополнительное условие: исключение товаров с уже установленной скидкой
Чтобы не применять двойную скидку, проверим, что у товара нет заданной цены распродажи.
add_filter('woocommerce_product_get_price', 'apply_custom_sale_price', 10, 2);
function apply_custom_sale_price($price, $product) {
$start_date = strtotime('2024-07-01');
$end_date = strtotime('2024-07-07 23:59:59');
$now = current_time('timestamp');
if ($now >= $start_date && $now <= $end_date) {
$sale_price = $product->get_sale_price();
if (empty($sale_price) && $price > 0) {
$discounted_price = $price * 0.8;
return round($discounted_price, wc_get_price_decimals());
}
}
return $price;
}Проверка результата после внедрения
- Откройте страницу товара в магазине на фронтенде в период действия скидки (установите системное время), проверьте цену — она должна быть снижена на 20%.
- Проверьте админку: цена товара в базе не изменилась, скидка отображается только на сайте.
- Проверьте другие товары с установленной скидкой — их цена не должна изменяться дополнительно.
- Выключите фильтр (закомментируйте код) и убедитесь, что цена вернулась к оригиналу.
Частые ошибки и как их исправить
- Ошибка: Скидка применяется дважды.
Причина: Не проверяется наличие цены распродажи у товара.
Решение: Добавьте проверкуif (empty($product->get_sale_price())). - Ошибка: Цена отображается некорректно в корзине или на странице оформления заказа.
Причина: Фильтр не применяется к корзине и заказам.
Решение: Добавьте фильтрыwoocommerce_cart_item_priceиwoocommerce_cart_item_subtotalдля согласования цен. - Ошибка: Неверное время скидки.
Причина: Используется неправильная временная зона.
Решение: Используйтеcurrent_time('timestamp')для получения времени в настройках WordPress.
Практические советы по производительности и безопасности
- Не используйте тяжелые запросы или сложные вычисления в фильтрах цены — это вызывается очень часто.
- Если скидка должна применяться к большому количеству товаров, рассмотрите возможность предварительной генерации цен и хранения их в метаполях.
- Всегда проверяйте, что пользователь не может обойти скидку через REST API или напрямую изменяя корзину.
Чек-лист для внедрения автоматического изменения цены в WooCommerce
- Определить условия применения скидки (даты, категории, теги).
- Реализовать фильтр для изменения цены с проверкой существующей скидки.
- Добавить фильтры для корректного отображения цены в корзине и заказах.
- Проверить работу на тестовом окружении с разными товарами.
- Тестировать работу в разных временных зонах и с кэшированием.
Сравнение вариантов реализации скидок в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Изменение цены через фильтр | Не изменяет базу, быстро и без плагинов | Можно пропустить цену в некоторых местах (нужны дополнительные фильтры) |
| Использование стандартных цен распродажи | Полная интеграция WooCommerce, поддержка кэширования | Не подходит для динамических условий, нужно редактировать товары вручную или программно |
| Плагины для автоматических скидок | Много функций, удобный интерфейс | Нагрузка на сайт, возможные конфликты |