Почему важно автоматически менять цену при снижении остатков
В интернет-магазинах на WooCommerce часто возникает задача динамически корректировать цены в зависимости от количества товара на складе. Это может быть полезно для стимулирования продаж или предупреждения дефицита. Автоматизация таких изменений помогает избежать ручного контроля и ошибок.
Диагностика проблемы: как понять, что автоматизация нужна именно вам
- Часто ли у вас меняются остатки товаров, и требуется ли мгновенно корректировать цены?
- Возникают ли ситуации, когда цена не актуальна из-за изменения запасов?
- Есть ли необходимость повысить цену при малом остатке для увеличения маржи?
Если ответ «да» хотя бы на один пункт, стоит настроить автоматическое обновление цен.
Пошаговое решение: как программно изменить цену при низком количестве товара
1. Добавляем хук на изменение запаса
WooCommerce предоставляет хук woocommerce_reduce_order_stock и фильтр woocommerce_product_get_price, но для оперативного изменения цены при обновлении запаса лучше использовать событие сохранения товара.
2. Пример кода для функции обновления цены
add_action('woocommerce_product_set_stock', 'update_price_on_low_stock', 10, 1);
function update_price_on_low_stock($product) {
$low_stock_threshold = 5; // Порог для снижения остатка
$increase_percent = 20; // Процент увеличения цены
if (!$product->managing_stock()) {
return;
}
$stock_quantity = $product->get_stock_quantity();
$regular_price = floatval($product->get_regular_price());
if ($stock_quantity <= $low_stock_threshold && $stock_quantity > 0) {
$new_price = $regular_price * (1 + $increase_percent / 100);
$product->set_price($new_price);
$product->save();
} elseif ($stock_quantity > $low_stock_threshold) {
// Возвращаем цену к регулярной, если запас восстановлен
$product->set_price($regular_price);
$product->save();
}
}
В этом коде цена товара увеличивается на 20%, если остаток меньше или равен 5. При восстановлении запаса цена возвращается к исходной.
3. Альтернативный подход: изменение цены в корзине через фильтр
Если менять цену товара в самом каталоге неудобно, можно динамически изменять цену в корзине:
add_action('woocommerce_before_calculate_totals', 'dynamic_price_by_stock');
function dynamic_price_by_stock($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
foreach ($cart->get_cart() as $cart_item) {
$product = $cart_item['data'];
$stock_quantity = $product->get_stock_quantity();
$low_stock_threshold = 5;
$increase_percent = 20;
if ($stock_quantity <= $low_stock_threshold && $stock_quantity > 0) {
$regular_price = floatval($product->get_regular_price());
$new_price = $regular_price * (1 + $increase_percent / 100);
$product->set_price($new_price);
}
}
}
Проверка результата после внедрения
- Обновите остаток товара в панели WooCommerce ниже порога (например, 5).
- Проверьте на витрине, изменилась ли цена товара (если применялся первый метод).
- Добавьте товар в корзину и убедитесь, что цена корректно увеличилась (для второго метода).
- Обновите количество обратно выше порога — цена должна вернуться к исходной.
Частые ошибки и как их исправить
- Цена не меняется после обновления запаса: Проверьте, что у товара включено управление запасами (
manage_stockдолжно быть true). - Изменения цены не отображаются в корзине: Возможно, кэширование страниц мешает — очистите кэш и проверьте работу на чистом браузере.
- Цена меняется, но не сохраняется после перезагрузки: Убедитесь, что вызывается метод
$product->save(). - Ошибка из-за неправильного типа объекта: В хуках проверяйте, что передается объект продукта
WC_Product, а не ID.
Практические советы по производительности и безопасности
- Не вызывайте
$product->save()внутри циклов без необходимости — это может нагрузить базу. - Для массового обновления цен лучше использовать WP-CLI или отдельные задачи cron.
- Проверяйте, что изменения цен не конфликтуют с другими плагинами, например, скидками или динамическими ценами.
- Используйте nonce и проверки прав, если добавляете интерфейс для управления порогами или процентами.
Сравнение способов реализации динамического изменения цены
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Изменение цены товара (изменение объекта WC_Product) | Цена видна повсеместно, включая каталог и карточку товара | Может замедлить админ-панель, требует сохранения продукта | Подходит для редких обновлений |
| Изменение цены в корзине через фильтр | Быстро, не меняет цену в каталоге, не требует сохранения | Цена в каталоге не меняется, только в корзине | Подходит для временных акций и динамических скидок |
| Использование плагинов динамического ценообразования | Простая настройка без кода, дополнительные функции | Может быть дорого, перегружать сайт | Если нужна комплексная логика ценообразования |