Диагностика проблемы: зачем нужна автоматическая смена цены по остатку товара
В интернет-магазинах на WooCommerce часто возникает задача стимулировать продажи товаров, у которых осталось мало единиц на складе. Например, при снижении остатка ниже заданного порога нужно автоматически изменить цену — сделать скидку или поднять цену за счёт дефицита. Это помогает управлять запасами и стимулировать покупателей.
Стандартный WooCommerce не предлагает встроенных инструментов для динамического изменения цены на основе количества товара. Обычно такие задачи решаются через кастомный код или сторонние плагины.
Как проверить текущую ситуацию в WooCommerce
- В админке перейдите в Товары → Все товары.
- В столбце Остаток обратите внимание на количество у товаров с управлением запасами.
- Проверьте, включено ли управление запасами (галочка Управлять запасами? в настройках товара).
- Проверьте, нет ли уже активных правил или плагинов для динамической цены (например, Dynamic Pricing).
Пошаговое решение: автоматическое изменение цены товара при снижении остатка ниже порога
1. Определяем порог и цель
В нашем примере порог — 5 единиц товара. Если остаток меньше или равен 5, мы уменьшаем цену на 10%. Если больше — цена возвращается к базовой.
2. Добавляем код в файл functions.php темы или в отдельный плагин
add_action('save_post_product', 'wc_update_price_based_on_stock', 20, 3); // При сохранении товара
function wc_update_price_based_on_stock($post_id, $post, $update) {
if ($post->post_type !== 'product') {
return;
}
$product = wc_get_product($post_id);
if (!$product->managing_stock()) {
return; // Управление запасами не включено
}
$stock_quantity = $product->get_stock_quantity();
$regular_price = (float) $product->get_regular_price();
$threshold = 5; // Порог
$discount_percent = 10; // Скидка 10%
if ($stock_quantity !== null && $stock_quantity <= $threshold) {
// Вычисляем новую цену
$new_price = round($regular_price * (1 - $discount_percent / 100), 2);
$product->set_price($new_price);
$product->set_sale_price($new_price);
} else {
// Возвращаем цену к обычной
$product->set_sale_price('');
$product->set_price($regular_price);
}
$product->save();
}3. Обработка изменения остатков при покупке
Чтобы цена менялась сразу при изменении количества на складе (например, после оформления заказа), добавим хук на обновление запасов:
add_action('woocommerce_reduce_order_stock', 'wc_update_price_after_stock_change', 10, 1);
function wc_update_price_after_stock_change($order) {
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product && $product->managing_stock()) {
$stock_quantity = $product->get_stock_quantity();
$regular_price = (float) $product->get_regular_price();
$threshold = 5;
$discount_percent = 10;
if ($stock_quantity !== null && $stock_quantity <= $threshold) {
$new_price = round($regular_price * (1 - $discount_percent / 100), 2);
$product->set_price($new_price);
$product->set_sale_price($new_price);
} else {
$product->set_sale_price('');
$product->set_price($regular_price);
}
$product->save();
}
}
}Проверка результата после внедрения
- Создайте тестовый товар с управлением запасами и установите цену, например, 1000 рублей.
- Установите остаток товара >5 и сохраните — цена должна оставаться 1000.
- Измените остаток товара на 5 или меньше и сохраните — цена должна автоматически уменьшиться на 10% (до 900 рублей).
- Оформите тестовый заказ, который уменьшит остаток ниже порога, и проверьте, что цена обновилась.
- Если кэширование включено, очистите кэш сайта и браузера.
Частые ошибки и как их исправить
- Цена не меняется после изменения остатка: возможно, кэширование блокирует обновление цены. Очистите кэш и проверьте, используете ли хуки правильно.
- Цена меняется, но не отображается на сайте: тема или плагин могут кэшировать цены. Проверьте шаблоны и отключите сторонние кеширующие решения временно.
- Ошибки PHP или сбои после добавления кода: проверьте синтаксис, используйте логи ошибок. Код должен добавляться в child тему или отдельный плагин.
- Управление запасами выключено на товаре: код игнорирует такие товары, включите управление запасами.
Практические советы по безопасности и производительности
- Не вызывайте функции обновления цены на каждом запросе — используйте хуки сохранения и изменения запасов.
- Тестируйте изменения на staging-сайте, чтобы избежать сбоя работы магазина.
- При масштабных магазинах с тысячами товаров подумайте о реализации через WP-Cron для пакетного обновления цен, чтобы не нагружать сервер.
- Включите резервное копирование перед внедрением кода, например, с помощью плагина Clearfy Pro для автоматических бэкапов.
Сравнение вариантов реализации
| Вариант | Плюсы | Минусы |
|---|---|---|
| Кастомный код (хуки save_post_product и woocommerce_reduce_order_stock) | Полный контроль, бесплатно, гибко | Требует навыков разработки, может конфликтовать с другими плагинами |
| Плагин Dynamic Pricing | Готовое решение, интерфейс настройки | Платный, возможно избыточен для простой задачи, нагрузка на сайт |
| Ручное изменение цен | Простота | Неэффективно, требует постоянного контроля |