Диагностика задачи: зачем менять цену товара автоматически после покупки
В некоторых интернет-магазинах, работающих на WooCommerce и теме GeneratePress, возникает задача динамически менять цену товара сразу после его покупки. Например, чтобы установить скидку для повторной покупки, повысить цену при дефиците или изменить цену по акции для зарегистрированных покупателей. Стандартный функционал WooCommerce не предусматривает автоматическое изменение цены товара после оформления заказа, поэтому требуется кастомизация.
Пошаговое решение: добавляем автоматическое изменение цены товара после покупки
1. Используем хук woocommerce_order_status_completed
Этот хук срабатывает, когда заказ переводится в статус «завершен» — оптимальный момент для внесения изменений в товар.
2. Получаем товары из заказа и меняем их цены
Мы перебираем все товары заказа, определяем ID и обновляем цену в базе данных.
add_action('woocommerce_order_status_completed', 'gp_change_product_price_after_purchase', 10, 1);
function gp_change_product_price_after_purchase($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$product = wc_get_product($product_id);
if (!$product) continue;
// Текущая цена
$current_price = $product->get_regular_price();
// Логика изменения цены: например, уменьшаем на 10%
$new_price = round($current_price * 0.9, 2);
// Обновляем цену
$product->set_regular_price($new_price);
$product->save();
}
}3. Кэширование и очистка
После изменения цены стоит очистить кэш WooCommerce и плагинов кеширования, чтобы изменения отобразились сразу. Например, вызовом wp_cache_flush() или через админку.
Проверка результата после внедрения
- Оформите тестовый заказ с покупкой нужного товара.
- Переведите заказ в статус «завершен» (если не происходит автоматически).
- Перейдите в админку WooCommerce > Товары и проверьте цену изменённого товара: она должна быть меньше на 10% от исходной.
- Внешний вид товара на сайте также должен показывать обновлённую цену.
Частые ошибки и как их исправить
- Цена не изменяется после покупки: Проверьте, что заказ действительно в статусе «завершен». Если используется другой статус, замените хук на
woocommerce_order_status_processingили подходящий. - Изменения не видны из-за кэширования: Очистите кэш сайта, браузера и плагинов кеширования.
- Цена меняется, но не сохраняется: Убедитесь, что у вас права на запись в базу. Проверьте логи ошибок PHP.
- Изменение цены влияет на все вариации товара: Если у товара есть вариации, добавьте проверку на тип товара и меняйте цену каждой вариации отдельно.
Практические советы по безопасности и производительности
- Не используйте слишком тяжелые операции внутри хука — перебор большого количества товаров может нагрузить сервер.
- Добавьте проверку, чтобы цена не стала меньше минимально допустимой (например, не ниже 1 рубля).
- Для сложных правил изменения цены лучше записывать данные в отдельное мета-поле, а не менять цену товара напрямую, чтобы избежать конфликтов с другими плагинами.
- Рассмотрите использование transient API для кеширования расчетов, если цена зависит от внешних факторов.
Сравнение способов изменения цены после покупки
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Прямое изменение цены товара через код | Меняем цену в объекте продукта на хук завершения заказа | Простота реализации, работает сразу | Изменение цены влияет на всех покупателей, риск ошибок при обновлении |
| Изменение цены на уровне корзины/сессии | Используем хуки woocommerce_before_calculate_totals для динамической цены | Цена меняется только для конкретного пользователя и заказа | Не сохраняется в базе, не влияет на постоянную цену товара |
| Использование мета-полей и кастомной логики для скидок | Хранение правил в мета-полях и применение через фильтры цены | Гибкость, можно создавать сложную логику | Требует более сложной реализации |