Проблема: необходимость динамически изменять цену товара при снижении остатка
В WooCommerce часто возникает задача изменять цену товара автоматически, если остаток на складе падает ниже определённого порога. Это полезно для стимулирования продаж или контроля запасов. Стандартный функционал WooCommerce не предусматривает такую автоматизацию, поэтому приходится реализовывать её самостоятельно или через кастомные решения.
Диагностика задачи и варианты решения
Первый шаг — определить, как именно должна изменяться цена:
- Простое уменьшение/увеличение цены на фиксированную сумму или процент;
- Установка новой фиксированной цены;
- Временное изменение цены (например, до пополнения склада).
- При обновлении остатка (ручном или автоматическом);
- Периодически через WP-Cron;
- При загрузке страницы товара или корзины (неэффективно и не рекомендуется).
Оптимальный вариант — менять цену сразу при обновлении остатка, чтобы цена была актуальна для покупателей.
Пошаговое решение: реализация автоматической смены цены через хук обновления запаса
1. Создание функции для проверки остатка и изменения цены товара
function wpdir_update_price_on_low_stock( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product || ! $product->managing_stock() ) {
return;
}
$stock_quantity = $product->get_stock_quantity();
$low_stock_threshold = 5; // Порог остатка
// Проверяем, ниже ли остаток порога
if ( $stock_quantity !== null && $stock_quantity <= $low_stock_threshold ) {
// Новая цена - снижение на 10%
$regular_price = (float) $product->get_regular_price();
$new_price = round( $regular_price * 0.9, 2 );
// Устанавливаем новую цену
$product->set_price( $new_price );
$product->save();
} else {
// Если остаток выше порога - вернуть стандартную цену
$regular_price = $product->get_regular_price();
$product->set_price( $regular_price );
$product->save();
}
}
2. Подключение функции к хуку изменения запаса
WooCommerce не имеет прямого хука на изменение запаса, но можно использовать woocommerce_product_set_stock, который вызывается при обновлении количества товара.
add_action( 'woocommerce_product_set_stock', 'wpdir_update_price_on_low_stock', 10, 1 );
3. Проверка работы решения
Для тестирования:
- Откройте товар в админке WooCommerce.
- Измените количество запаса на число ниже или равное 5.
- Сохраните изменения.
- Проверьте, изменилась ли цена товара в карточке товара на сайте (снижение на 10%).
- Если увеличить запас выше 5, цена должна вернуться к оригинальной.
Чек-лист для отладки и проверки
- Убедитесь, что у товара включён учёт запасов (
manage_stock= true). - Включён ли хук
woocommerce_product_set_stock(не переопределяется ли где-то). - Вызываете ли сохранение товара через админку, чтобы сработал хук.
- Проверьте, что цены обновляются и сохраняются корректно.
- Проверьте, что цена возвращается к оригинальной при увеличении запаса.
Частые ошибки и как их исправить
1. Изменение цены не происходит
- Проверьте, что хук
woocommerce_product_set_stockдействительно срабатывает. Для этого временно добавьтеerror_log('Hook triggered for product ' . $product_id);внутрь функции. - Убедитесь, что у товара активирован учёт запасов.
2. Цена меняется, но не отображается на сайте
- Возможно, кэширование страницы или объекта товара. Очистите кэш сайта и браузера.
- Проверьте, не переопределяется ли цена другими плагинами или темой.
3. Некорректное округление или установка цены
- Используйте функцию
round($value, 2)для округления цены до двух знаков. - Проверяйте, что цена всегда положительна и не равна нулю.
Практические советы по производительности и безопасности
- Не используйте для изменения цены хуки, срабатывающие при загрузке фронтенда (например,
template_redirect) — это замедлит сайт. - Обрабатывайте изменение цены только при изменении запаса, чтобы минимизировать лишние запросы к базе.
- Резервируйте исходную цену в метаполе, если планируете более сложные сценарии возврата цены.
- Обязательно тестируйте изменения на тестовом стенде, чтобы избежать сбоев на живом сайте.
- Если используете кэширование (например, object cache), очищайте кэш после изменения цены.
Сравнение решений: плагин vs. кастомный код
| Критерий | Плагин | Кастомный код (как в статье) | Компромисс |
|---|---|---|---|
| Гибкость | Средняя, зависит от плагина | Полная, можно адаптировать под любые требования | Код требует поддержки |
| Производительность | Может замедлять сайт | Оптимизирован под задачу | Нужны тесты и оптимизация |
| Сложность внедрения | Просто установить и настроить | Требуется разработчик | Средняя, зависит от уровня знаний |
| Безопасность | Зависит от качества плагина | Зависит от кода | Контроль выше при кастоме |