Диагностика задачи: зачем менять цену при низком остатке
В WooCommerce может быть полезно автоматически менять цену товара при достижении определённого порога остатка. Например, снижать цену для распродажи излишков или повышать цену при дефиците. Это помогает управлять запасами и стимулировать продажи без ручного вмешательства.
Какие показатели нужно проверить перед настройкой
- Наличие актуальных остатков
_stockв базе WooCommerce - Настроена ли поддержка управления запасами для товара
- Тип товара (простой, вариативный) и поведение изменения цены для каждого типа
Пошаговое решение: автоматическое изменение цены при низком остатке
Реализуем изменение цены через хук woocommerce_before_calculate_totals, который позволяет корректировать цену в корзине динамически. Если нужно менять цену на странице товара, потребуется фильтр woocommerce_get_price.
Пример кода для простых товаров (functions.php темы или плагина):
add_action('woocommerce_before_calculate_totals', 'change_price_on_low_stock', 10, 1);
function change_price_on_low_stock($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
// Порог остатков
$stock_threshold = 5;
// Процент изменения цены (например, скидка 20%)
$discount_percentage = 20;
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
if (!$product->managing_stock()) continue;
$stock_quantity = $product->get_stock_quantity();
if ($stock_quantity <= $stock_threshold && $stock_quantity > 0) {
$original_price = $product->get_regular_price();
$new_price = $original_price * (1 - $discount_percentage / 100);
$cart_item['data']->set_price($new_price);
}
}
}Этот код применит скидку 20%, если остаток товара 5 или меньше, при добавлении в корзину.
Изменение цены на странице товара
Чтобы покупатель видел изменённую цену сразу, используйте фильтр:
add_filter('woocommerce_get_price', 'modify_price_display_based_on_stock', 10, 2);
function modify_price_display_based_on_stock($price, $product) {
$stock_threshold = 5;
$discount_percentage = 20;
if ($product->managing_stock()) {
$stock_quantity = $product->get_stock_quantity();
if ($stock_quantity <= $stock_threshold && $stock_quantity > 0) {
$price = $product->get_regular_price() * (1 - $discount_percentage / 100);
}
}
return $price;
}Проверка результата
- Добавьте в WooCommerce товар с остатком 5 или меньше
- Откройте страницу товара и проверьте, что цена изменилась согласно заданной логике
- Добавьте товар в корзину, перейдите к оформлению заказа и убедитесь, что цена в корзине совпадает с изменённой
- Измените остаток товара выше порога и проверьте, что цена возвращается к исходной
Частые ошибки и как их исправить
- Цена не меняется в корзине или на странице товара: проверьте, что код добавлен в
functions.phpактивной темы или в отдельный плагин и что нет конфликтов с другими плагинами, которые переопределяют цены. - Изменение цены применяется к товарам без управления запасами: добавьте проверку
$product->managing_stock()и убедитесь, что это условие работает. - Проблемы с вариативными товарами: для вариативных товаров нужно изменить цену вариации, а не родительского товара. Используйте
$product->is_type('variation')и работайте с объектом вариации. - Изменённая цена не отображается в виджетах или кэшированных блоках: очистите кэш и проверьте, что кэширование не мешает динамическому изменению цены.
Практические советы по безопасности и производительности
- Не изменяйте цены напрямую в базе данных — используйте хуки WooCommerce для динамических изменений.
- Для больших магазинов с сотнями товаров реализация на стороне PHP должна быть оптимизирована, чтобы избежать излишней нагрузки на сервер.
- Если используете кэширование страниц (например, через плагин), исключите страницы корзины и товара из кэширования, чтобы динамическая цена отображалась корректно.
- Тестируйте обновления WooCommerce — API и хуки могут меняться, что повлияет на работу кастомных функций.
Сравнение способов реализации изменения цены
| Метод | Преимущества | Недостатки | Пример кода |
|---|---|---|---|
Хук woocommerce_before_calculate_totals (корзина) |
Изменяет цену только в корзине и оформлении, безопасно | Цена на странице товара не меняется, пользователь может быть не информирован | Да (пример выше) |
Фильтр woocommerce_get_price (отображение цены) |
Меняет цену на странице товара, пользователь видит актуальную цену | Не меняет цену в заказе по умолчанию, нужно дополнительно менять в корзине | Да (пример выше) |
| Изменение цены в базе данных | Постоянное изменение цены, подходит для длительных акций | Риск ошибок, требует отката изменений, может сломать отчёты и аналитику | Не рекомендуется |