Диагностика задачи: зачем изменять цену товара после оплаты
Иногда в WooCommerce возникает задача динамически менять цену товаров после успешной оплаты заказа. Это может быть нужно для учета бонусов, скидок, изменения стоимости повторных покупок или корректировки цены в зависимости от состояния клиента. Но стандартными средствами WooCommerce это не реализуется, поэтому требуется программное решение.
Пошаговое решение: автоматическое изменение цен товаров после оплаты
1. Использование хука woocommerce_order_status_completed
Этот хук срабатывает, когда заказ переходит в статус «завершён». В момент завершения можно написать функцию, которая изменит метаданные товаров или их цены в каталоге.
2. Пример кода для изменения цены определённого товара после оплаты
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); foreach ($order->get_items() as $item) { $product_id = $item->get_product_id(); // Получаем объект товара $product = wc_get_product($product_id); if (!$product) continue; // Новая цена, например уменьшаем на 10% $old_price = $product->get_regular_price(); $new_price = $old_price * 0.9; // Обновляем цену товара $product->set_regular_price($new_price); $product->save(); } }В этом примере после завершения заказа у каждого товара из заказа цена уменьшается на 10%. Это демонстрация, в реальности логику можно менять под задачи.
Как проверить, что изменение цены сработало
- Откройте в админке WooCommerce карточку товара из заказа и убедитесь, что цена изменилась.
- Сделайте тестовый заказ с этим товаром, завершите его, и проверьте обновление цены.
- Проверьте, что цена изменилась для всех пользователей, т.к. меняется цена в базе.
Частые ошибки и их исправление
- Изменение цены не происходит
Проверьте, что хукwoocommerce_order_status_completedдействительно срабатывает. Можно добавитьerror_log('Hook triggered');для отладки. - Цена изменяется, но не отображается на сайте
Очистите кеш сайта и браузера, иногда WooCommerce кэширует цены. - Изменение цены влияет на исторические заказы
Если нужно менять цену только для будущих заказов, а не текущих, меняйте цену отдельно через пользовательские поля или метаданные, а не в объекте товара напрямую. - Изменение цены влияет на все варианты товара, когда нужно только на конкретный
Убедитесь, что используете правильный ID варианта ($item->get_variation_id()) если это вариативный товар.
Практические советы по безопасности и производительности
- Не изменяйте цены товара слишком часто и массово — это может привести к потере данных или конфликтам при одновременных заказах.
- Сохраняйте резервные копии базы перед массовыми изменениями цен.
- Для сложных логик изменения цен используйте отдельные пользовательские поля или теги, а не меняйте основную цену товара.
- Используйте транзакции базы данных или wpdb для более надежного обновления, если работаете с большим количеством товаров.
Альтернативы: плагин vs код vs компромисс
| Вариант | Плюсы | Минусы |
|---|---|---|
| Свой код на хуке | Полный контроль, нет нагрузки плагинов | Требует навыков, возможны ошибки |
| Использование плагина динамического ценообразования | Готовое решение, поддержка | Может быть тяжеловесным, не всегда гибок |
| Компромисс: код + легкий плагин | Быстрая реализация с кастомизацией | Нужно следить за совместимостью |