Диагностика задачи: зачем менять цену при снижении остатка
В интернет-магазинах часто требуется динамически корректировать цену товара в зависимости от количества на складе. Например, при уменьшении остатка цена может повыситься из-за дефицита, либо наоборот снизиться для стимулирования продаж. В WooCommerce нет встроенного функционала для автоматического изменения цен на основе остатков, поэтому такую логику приходится реализовывать самостоятельно.
Выбор подхода: плагин vs код
Для реализации автоматического изменения цены при снижении остатка можно использовать:
- Плагины динамического ценообразования с поддержкой условий по запасам (но они часто комплексные и платные)
- Кастомный код с использованием хуков WooCommerce для контроля остатков и обновления цен
Ниже рассмотрим практический пример на PHP с использованием стандартных хуков WooCommerce.
Пошаговое решение: автоматическое изменение цены через хук обновления остатков
1. Создаем функцию для изменения цены товара
Будем менять цену, когда остаток товара опустится ниже установленного порога.
function wpcatalog_adjust_price_on_stock_change( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product || ! $product->managing_stock() ) {
return;
}
$stock_quantity = $product->get_stock_quantity();
$threshold = 10; // Порог остатка
$original_price = floatval( $product->get_regular_price() );
if ( $stock_quantity !== null && $stock_quantity < $threshold ) {
// Уменьшаем цену на 10% при низком остатке
$new_price = round( $original_price * 0.9, 2 );
} else {
// Возвращаем оригинальную цену
$new_price = $original_price;
}
if ( $new_price != $product->get_price() ) {
$product->set_price( $new_price );
$product->save();
}
}
2. Привязываем функцию к событию обновления остатков
WooCommerce не имеет прямого хука для изменения остатка, поэтому используем woocommerce_product_set_stock (доступен с версии 3.0).
add_action( 'woocommerce_product_set_stock', 'wpcatalog_adjust_price_on_stock_change', 10, 1 );
Проверка результата после внедрения
- Обновите остаток товара вручную в админке WooCommerce, установив значение ниже 10
- Обновите страницу товара на сайте и проверьте цену — должна уменьшиться на 10%
- Увеличьте остаток выше 10 и проверьте, что цена вернулась к исходной
- Для более точной проверки используйте
error_logили вывод в консоль, добавив внутри функции строки для логирования
Частые ошибки и как их исправить
- Функция не срабатывает при изменении остатка: Проверьте, что используется актуальный хук
woocommerce_product_set_stock. Если остатков не меняют через стандартный метод, хук не вызовется. - Цена не меняется или меняется некорректно: Убедитесь, что в админке у товара включено управление остатками (
manage_stock= true). Также проверьте правильность типов данных (float для цены). - Конфликты с кэшированием: После обновления цены очистите кэш сайта и браузера, иначе увидите старую цену.
- Проблемы с вариациями: Для вариативных товаров нужно отдельно реализовывать логику для каждого варианта, так как у них свои ID и остатки.
Практические советы по безопасности и производительности
- Не вызывайте
$product->save()без необходимости — это может привести к множественным запросам к базе при массовом обновлении. - Для массовых изменений лучше использовать WP CLI или отдельные скрипты с пакетной обработкой.
- Добавьте проверку nonce и прав пользователя, если расширяете функционал для фронтенда.
- Используйте транзиенты или кеширование, если считываете цены часто в пользовательской части.
Сравнение подходов к автоматическому изменению цены товара при снижении остатка
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Плагины динамического ценообразования | Готовое решение, гибкие правила | Могут быть дорогими, избыточны для простой задачи | Сложные условия, много товаров |
| Кастомный код на хуках WooCommerce | Легко адаптировать, нет дополнительных затрат | Требует навыков разработки, может влиять на производительность | Простые правила, небольшие каталоги |