WooCommerce: как изменить стоимость товара после оплаты с помощью хука

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

В стандартном WooCommerce цена товара фиксируется на момент оформления заказа. Однако бывают задачи, когда нужно автоматически изменить стоимость товара после успешной оплаты — например, для корректировки скидок, учёта дополнительных затрат или бонусов. Часто это требуется для интеграции с внешними сервисами или учёта постфактум изменений.

Если попытаться менять цену товара напрямую через административную панель после оплаты, это никак не повлияет на уже сделанный заказ. Поэтому нужно программное решение, которое изменит стоимость товара в заказе или подготовит данные для последующих действий.

Пошаговое решение: использование хука woocommerce_order_status_completed

Для изменения стоимости товара после оплаты воспользуемся хуком woocommerce_order_status_completed. Он срабатывает, когда заказ переходит в статус "завершён", то есть оплата подтверждена.

Основная идея — пройтись по товарам заказа, изменить их цену с помощью метода set_total() у объекта WC_Order_Item_Product, затем сохранить изменения.

add_action('woocommerce_order_status_completed', 'custom_change_product_price_after_payment', 10, 1);  
function custom_change_product_price_after_payment($order_id) {
    if (!$order_id) return;

    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($order->get_items() as $item_id => $item) {
        // Текущая цена товара в заказе
        $original_total = $item->get_total();

        // Логика изменения цены, например, уменьшение на 10%
        $new_total = round($original_total * 0.9, 2);

        // Устанавливаем новую стоимость
        $item->set_total($new_total);
        $item->save();
    }

    // Обновляем итоги заказа после изменений
    $order->calculate_totals();
    $order->save();
}

Этот код изменит цену каждого товара в заказе, уменьшив её на 10% после оплаты.

Подробности и рекомендации

  • Используйте $item->set_total() для изменения стоимости позиции.
  • После изменения всех позиций вызовите $order->calculate_totals() для пересчёта итогов.
  • Не забудьте сохранить объект заказа с помощью $order->save().
  • Если нужно изменить цену только для определённых товаров, добавьте проверку по ID или SKU.

Проверка результата после внедрения

Чтобы убедиться, что изменение стоимости прошло успешно:

  • Оформите тестовый заказ с товарами.
  • Оплатите заказ (можно в режиме теста платежной системы).
  • Перейдите в административную часть WooCommerce → Заказы → откройте этот заказ.
  • Проверьте стоимость товаров — она должна быть изменена согласно логике в коде (например, уменьшена на 10%).
  • Тотал заказа должен быть пересчитан и отражать новые суммы.

Частые ошибки и их исправление

  • Цена товара не меняется: Проверьте, что хук зарегистрирован правильно и функция вызывается. Можно добавить error_log() внутри функции для отладки.
  • Итоги заказа не пересчитываются: Обязательно вызывайте $order->calculate_totals() и $order->save() после изменений.
  • Изменения не видны в письмах и счётах: Возможно, изменения произошли после генерации документов. Для обновления используйте триггер повторной генерации или кастомные фильтры.
  • Неправильный формат цены: При расчётах используйте round($value, 2) для корректного отображения цен с двумя знаками после запятой.

Практические советы по безопасности и производительности

  • Используйте проверку типа заказа и статуса, чтобы не менять цены неуместно.
  • Добавьте логирование ключевых изменений для контроля и отладки.
  • Не делайте тяжелых запросов или операций внутри хука, чтобы не замедлять обработку заказа.
  • Тестируйте изменения на локальной или staging-среде перед выводом на продакшен.

Сравнение подходов: код vs плагины

СпособПлюсыМинусы
Код на хуке woocommerce_order_status_completedПолный контроль, гибкость, не требует установки плагиновТребует навыков программирования, возможны ошибки без тестирования
Плагины для динамического ценообразованияПростота настройки, дополнительные функции, поддержкаМожет влиять на производительность, не всегда подходит под уникальные задачи
WooCommerce: как изменить стоимость товара после оплаты с помощью хука
04.05.2026
WooCommerce: как эффективно очистить базу от старых корзин и заказов
20.05.2026
Как удалить дубли продуктов в WooCommerce через код
07.05.2026
Как быстро удалить все категории из постов WordPress через код
06.01.2026
Как добавить автоматическое сохранение записей в WordPress
13.12.2025