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

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

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

Для реализации таких сценариев нужно вмешаться в логику WooCommerce после смены статуса заказа на «оплачен» и программно изменить стоимость товара или итоговую сумму заказа.

Как использовать хук woocommerce_order_status_completed для изменения стоимости

Хук woocommerce_order_status_completed срабатывает, когда статус заказа меняется на «завершён». В этот момент можно получить данные заказа, пройтись по товарам и изменить их цену.

Важно: изменить цену в заказе после оплаты — значит обновить метаданные заказа, а не товар в каталоге, иначе это повлияет на все будущие заказы.

Пример кода: изменение цены товара в заказе после оплаты

add_action('woocommerce_order_status_completed', 'change_order_item_prices_after_payment', 10, 1);
function change_order_item_prices_after_payment( $order_id ) {
    $order = wc_get_order( $order_id );
    foreach ( $order->get_items() as $item_id => $item ) {
        // Получаем текущую цену
        $old_price = $item->get_subtotal() / $item->get_quantity();
        // Новая цена - например, скидка 10%
        $new_price = $old_price * 0.9;
        // Задаём новую цену для позиций заказа
        $item->set_subtotal( $new_price * $item->get_quantity() );
        $item->set_total( $new_price * $item->get_quantity() );
        $item->save();
    }
    // Пересчитываем итоги заказа
    $order->calculate_totals();
    $order->save();
}

Пошаговое решение задачи

  1. Подключитесь к серверу через FTP или используйте редактор тем/плагинов WordPress.
  2. Добавьте код из примера в файл functions.php активной темы или создайте отдельный плагин для кастомных функций.
  3. Измените логику в функции change_order_item_prices_after_payment по вашим правилам — например, задайте другую формулу для новой цены или применяйте изменения только к определённым товарам.
  4. Сохраните изменения и сделайте тестовый заказ в магазине, оплатив его.
  5. Проверьте в админке WooCommerce, что цена в заказе изменилась после перехода в статус «завершён».

Как проверить, что решение сработало

  • Создайте тестовый заказ в WooCommerce с реальным или тестовым платежом.
  • Оплатите заказ, дождитесь смены статуса на «завершён» (completed).
  • В админке откройте заказ и проверьте цены позиций: они должны быть изменены согласно вашей логике.
  • В личном кабинете пользователя тоже должны отображаться обновлённые суммы.
  • Если итоговые суммы изменились — решение работает.

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

  • Изменение цены товара в каталоге вместо заказа: вызывайте методы изменения цены только у объекта $item заказа, а не напрямую у WC_Product. Иначе цена товара изменится для всех покупателей.
  • Отсутствие вызова $order->calculate_totals(): итоговые суммы заказа не обновятся, и стоимость не изменится визуально.
  • Изменение цены до смены статуса на completed: хук woocommerce_order_status_completed срабатывает после оплаты, раньше может быть неактуально.
  • Ошибки при сохранении заказа: всегда вызывайте $item->save() и $order->save() после внесения изменений.

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

  • Безопасность: не меняйте цену товара в каталоге — это может привести к несоответствиям и проблемам с учётом.
  • Проверяйте права пользователя и валидность $order_id в функции, чтобы не менять чужие заказы или невалидные данные.
  • Оптимизация: избегайте сложных запросов и операций в хуке, если у вас большой магазин, чтобы не замедлять обработку заказов.
  • Логируйте изменения цен для отладки и аудита, например, с помощью error_log() или пользовательских логов.

Сравнение методов изменения цены после оплаты

МетодОписаниеПлюсыМинусы
Изменение цены в заказе через хукМеняем цену только в объекте заказа после оплатыБезопасно для каталога, гибко на заказНе влияет на цены других заказов
Изменение цены товара программноМеняем цену в WC_ProductВлияет на все заказы, удобно для акцийРиск ошибок, влияет на все покупателей
Использование плагинов скидок и купоновДобавляем скидку через стандарт WooCommerceПростота, поддержкаМеньшая гибкость, зависит от плагина
Как установить и настроить приватный плагин WordPress
30.12.2025
Как использовать AJAX в формах WordPress без плагинов
29.01.2026
Как использовать REST API для управления пользователями в WordPress
16.04.2026
WooCommerce: как добавить и отобразить дополнительные поля в форме оформления заказа
10.05.2026
WooCommerce: установка и настройка дополнительного поля в форме оформления заказа
23.04.2026