В чём суть задачи: почему нужно менять цены при снижении запаса
В интернет-магазинах на WooCommerce часто возникает необходимость динамически корректировать цены товаров при уменьшении их остатков на складе. Это может быть маркетинговым приёмом для стимулирования продаж товаров с низким запасом или предупреждением для покупателей о дефиците. В стандартном WooCommerce такой функционал отсутствует, приходится реализовывать его самостоятельно.
Диагностика проблемы: как понять, что цены не меняются автоматически
Если вы хотите, чтобы цена товара менялась при снижении остатка, но этого не происходит, проверьте следующие моменты:
- В WooCommerce нет встроенных настроек для автоматического изменения цен в зависимости от количества на складе.
- Отсутствует кастомный код или плагин, реализующий такую логику.
- Проверяйте, обновляется ли количество товара в момент покупки и корректно ли отображается на странице товара.
- Убедитесь, что нет конфликтов с кэшированием, которые могут препятствовать обновлению цен.
Пошаговое решение: как автоматически менять цены при снижении запаса
1. Добавляем хук для отслеживания изменения количества товара
Для изменения цены при снижении запаса используем хук woocommerce_reduce_order_stock, который срабатывает после оформления заказа и уменьшения количества товара.
add_action('woocommerce_reduce_order_stock', 'wc_change_price_on_stock_reduction', 10, 1);function wc_change_price_on_stock_reduction($order) { foreach ($order->get_items() as $item) { $product = $item->get_product(); if (!$product || !$product->managing_stock()) { continue; } $stock_quantity = $product->get_stock_quantity(); // Условие для снижения цены: если запас меньше 10 if ($stock_quantity !== null && $stock_quantity < 10) { $new_price = $product->get_regular_price() * 0.9; // скидка 10% // Обновляем цену через мета поле '_regular_price' и '_price' update_post_meta($product->get_id(), '_regular_price', $new_price); update_post_meta($product->get_id(), '_price', $new_price); // Обновляем объект продукта для текущей сессии $product->set_price($new_price); } }}2. Обновляем кэш и перезапускаем пересчёт цен
Чтобы изменения вступили в силу, нужно сбросить кэш WooCommerce и пересчитать цены. Добавьте в конец функции:
wc_delete_product_transients( $product->get_id() );Это сбросит кэшированную информацию о продукте.
3. Обработка возврата запасов
Если запас товара увеличится (например, при возврате), можно вернуть цену к исходной. Для этого используйте хук woocommerce_order_status_changed для отслеживания возвратов и обновления цены.
Проверка результата после внедрения
- Оформите заказ с товаром, запас которого изначально больше 10.
- Убедитесь, что после заказа запас уменьшается.
- Проверьте цену товара в админке и на фронтенде — она должна уменьшиться на 10% при достижении запаса ниже 10.
- Очистите кэш и перезагрузите страницу товара для отображения новой цены.
Частые ошибки и как их исправить
- Цена не меняется после заказа: убедитесь, что хук
woocommerce_reduce_order_stockподключён и код активен в functions.php или в плагине. - Изменения цены не видны на сайте: вероятно, кэш страниц или объектов блокирует обновление. Очистите кэш плагина кэширования и WooCommerce с помощью
wc_delete_product_transients(). - Проблемы с вариациями: для вариативных товаров нужно отдельно обновлять цены вариаций, получая объект вариации через
wc_get_product( $variation_id ). - Ошибки с типами товаров, не управляющих запасом: добавьте проверку
$product->managing_stock().
Практические советы по безопасности и производительности
- Не обновляйте цену в каждой транзакции без условий — это повысит нагрузку на базу данных.
- Используйте transient API для кэширования результатов вычислений, если логика будет усложняться.
- Всегда проверяйте права доступа и типы продуктов перед изменением мета-данных.
- Резервируйте базу данных перед массовыми изменениями цен.
Сравнение подходов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Кастомный код (описанный выше) | Гибкость, отсутствие дополнительных плагинов, точечное решение | Нужно тестировать, требует навыков программирования |
| Плагин динамического ценообразования (например, WooCommerce Dynamic Pricing) | Быстрая настройка, много условий, поддержка | Платные решения, нагрузка на сайт, избыточность для простой задачи |
| Ручное изменение цен в админке | Простота, не требует кода | Неавтоматизировано, ошибки человеческого фактора |