Диагностика проблемы: зачем менять стоимость товара после оплаты
В WooCommerce цена товара обычно фиксируется при оформлении заказа. Однако бывают случаи, когда нужно изменить стоимость уже после оплаты, например, для учёта скидок, возвратов, бонусов или корректировок бухгалтерии. Проблема в том, что стандартные механизмы WooCommerce не предусматривают автоматическую замену цены после оплаты, а отображение в заказах и отчётах остаётся прежним. Это создаёт рассогласование и мешает точному учёту.
Как проверить текущую ситуацию с ценами в заказах WooCommerce
Для диагностики откройте любой оплаченный заказ в админке WooCommerce и посмотрите блок Товары заказа. Обратите внимание на колонку с ценой и итоговую стоимость. Если там не отражены нужные изменения, значит нужно вмешательство через код.
Также проверьте таблицу базы данных wp_woocommerce_order_items и wp_woocommerce_order_itemmeta, чтобы понять, какие цены там сохранены. Это важно для корректного обновления.
Пошаговое решение: изменение стоимости товара после оплаты с помощью хука
1. Используем хук woocommerce_order_status_completed
Этот хук срабатывает, когда заказ переводится в статус "завершён" — обычно после оплаты. В этот момент можно изменить цену товаров в заказе программно.
2. Код для изменения цены товара в заказе
add_action('woocommerce_order_status_completed', 'custom_change_order_item_price_after_payment', 10, 1);
function custom_change_order_item_price_after_payment($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item_id => $item) {
// Новая цена, например, уменьшаем на 10%
$old_price = $item->get_total() / $item->get_quantity();
$new_price = round($old_price * 0.9, 2); // 10% скидка
// Обновляем цену товара в позиции заказа
$item->set_subtotal($new_price * $item->get_quantity());
$item->set_total($new_price * $item->get_quantity());
// Если есть налоги, их нужно пересчитать
$item->save();
}
// Пересчёт итогов заказа
$order->calculate_totals();
$order->save();
}3. Важные моменты
- Выбирайте подходящий статус заказа в зависимости от бизнес-процесса — иногда это
processing, а неcompleted. - Если в заказе есть налоги, скидки или купоны, их нужно корректно пересчитать. В примере выше пересчёт налогов не учтен, для сложных случаев требуется доработка.
- Изменение цены в заказе не меняет цену самого товара в каталоге.
Проверка результата после внедрения
- Создайте тестовый заказ с оплатой в статусе, на который повешен хук.
- После смены статуса откройте заказ в админке и проверьте цены в позиции товара и итоговую сумму.
- Проверьте, что сумма заказа изменилась согласно логике в коде (например, уменьшилась на 10%).
- Проверьте отчёты WooCommerce и убедитесь, что там отображаются обновлённые суммы.
Частые ошибки и как их исправить
- Изменения не применяются: проверьте, правильно ли указан хук и статус заказа. Иногда заказ не переходит в
completed, используйтеprocessingилиwoocommerce_payment_complete. - Налоги и итоги не пересчитываются: вызывайте
$order->calculate_totals()и$item->save()после изменения суммы. - Цена товара меняется в каталоге: убедитесь, что вы меняете только данные в заказе, а не сам объект товара
WC_Product. - Кэширование мешает увидеть изменения: сбросьте кэш сайта и браузера.
Практические советы по производительности и безопасности
- Не запускайте дорогостоящие операции внутри хука — изменение цен должно быть максимально лёгким.
- Для массовых заказов используйте WP-CLI или фоновые задачи.
- Сохраняйте логи изменений, чтобы иметь историю корректировок цен.
- Не изменяйте цены через прямое обновление базы без использования API WooCommerce — это может привести к рассинхронизации.
Сравнение способов изменения цены товара после оплаты
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
Изменение через хук woocommerce_order_status_completed | Автоматизация, интеграция с процессом оплаты | Нужно писать код, возможны ошибки с налогами | Подходит для большинства задач |
| Ручное изменение в админке | Просто, не требует кода | Трудоёмко, не для массовых заказов | Использовать для единичных случаев |
| Плагины для корректировки заказа | Готовые решения, удобный интерфейс | Могут замедлять сайт, платные | Подходит при отсутствии времени на разработку |