WooCommerce: как изменить стоимость товара после оплаты и использовать это в учёте

Диагностика проблемы: зачем менять стоимость товара после оплаты

В 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Автоматизация, интеграция с процессом оплатыНужно писать код, возможны ошибки с налогамиПодходит для большинства задач
Ручное изменение в админкеПросто, не требует кодаТрудоёмко, не для массовых заказовИспользовать для единичных случаев
Плагины для корректировки заказаГотовые решения, удобный интерфейсМогут замедлять сайт, платныеПодходит при отсутствии времени на разработку
Как создать собственный шорткод в WordPress
10.11.2025
WooCommerce: как изменить стоимость товара после оплаты с помощью хука
04.05.2026
Как вывести оценки пользователей в WordPress с помощью плагинов и кода
25.02.2026
Как удалить неиспользуемые роли и права в WordPress без рисков
04.02.2026
Оптимизация кода WordPress: эффективные методы и примеры
07.11.2025