Диагностика проблемы с изменением стоимости товаров после оплаты
В WooCommerce часто возникает задача изменить стоимость товара или заказа после успешной оплаты — например, применить скидку ретроспективно, учесть бонусы или изменить цену для внутреннего учёта. Однако стандартные методы обновления стоимости в корзине не работают после завершения заказа, и виджет итоговой суммы не обновляется автоматически.
Чтобы проверить, что стоимость не меняется после оплаты, достаточно оформить тестовый заказ и посмотреть в админке или на странице заказа, что сумма не отражает ожидаемых изменений.
Какой хук использовать для изменения стоимости после оплаты
Для вмешательства после оплаты лучше всего использовать хук woocommerce_order_status_completed. Он срабатывает, когда статус заказа меняется на «завершён» — сигнализируя, что оплата прошла успешно и можно вносить корректировки.
Также возможен хук woocommerce_payment_complete, который срабатывает сразу после оплаты, но не после изменения статуса.
Пример использования woocommerce_order_status_completed
add_action('woocommerce_order_status_completed', 'custom_change_order_items_price', 10, 1);
function custom_change_order_items_price($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item_id => $item) {
// Новая цена товара после оплаты
$new_price = 100; // например фиксированная цена
// Устанавливаем новую цену для элемента заказа
$item->set_subtotal($new_price * $item->get_quantity());
$item->set_total($new_price * $item->get_quantity());
$item->save();
}
// Обновляем итоги заказа
$order->calculate_totals();
$order->save();
}Пошаговое решение: как реализовать автоматическое изменение цены после оплаты
- Подключитесь к сайту по FTP или через редактор тем.
- Откройте файл
functions.phpвашей дочерней темы или создайте небольшой плагин для кастомного кода. - Вставьте код из примера выше, скорректировав логику расчёта новой цены.
- Сохраните изменения и очистите кеш сайта и браузера.
- Оформите тестовый заказ и дожидайтесь смены статуса на «завершён».
Проверка результата после внедрения
После смены статуса заказа на «завершён» перейдите в админку WooCommerce > Заказы, откройте заказ и проверьте стоимость каждого товара и итоговую сумму. Цены должны соответствовать новым значениям, заданным в коде.
Если вы выводите стоимость заказа на фронтенде, обновите страницу, чтобы увидеть изменения. Для дополнительной проверки можно вывести лог в файл с помощью error_log() внутри функции.
Частые ошибки и как их исправить
- Изменения не сохраняются: убедитесь, что вызываете
$item->save()и$order->save()после внесения изменений. - Цена не меняется на фронтенде: возможно, включено кэширование — очистите все кеши, включая серверный и браузерный.
- Функция не срабатывает: проверьте, что хук подключён корректно и ваш код не конфликтует с другими плагинами.
- Неправильные расчёты итогов: используйте
$order->calculate_totals()после изменения цен, иначе сумма заказа не пересчитается.
Практические советы по безопасности и производительности
- Не изменяйте цены товаров в базе напрямую без проверки — лучше менять цены только в заказах, чтобы не влиять на каталог.
- Всегда тестируйте код на staging-сайте перед применением на боевом.
- Избегайте тяжёлых операций в хуках оплаты — они влияют на скорость оформления заказа.
- Для прозрачности логируйте изменения цен в отдельный файл или метаданные заказа.
Сравнение вариантов реализации изменений цены после оплаты
| Метод | Плюсы | Минусы |
|---|---|---|
Хук woocommerce_order_status_completed | Работает после подтверждения оплаты, удобно для финальных изменений | Не срабатывает, если статус не обновляется |
Хук woocommerce_payment_complete | Срабатывает сразу после оплаты | Менее универсален, не учитывает смену статуса |
| Изменение цен в корзине с помощью фильтров | Простая реализация до оформления заказа | Не работает после оплаты, не подходит для корректировок в заказе |