Диагностика проблемы: зачем менять стоимость и наличие товара после заказа
В стандартном WooCommerce после оформления заказа цена товара и его наличие в каталоге не меняются автоматически, что может привести к несоответствиям, например, при продаже по предзаказу, динамическом ценообразовании или учёте остатков вручную. Если в вашей логике продаж требуется корректировать цену или статус наличия товара сразу после завершения заказа, стандартных настроек WooCommerce недостаточно.
Типичные признаки проблемы:
- Цена товара не отражает специальные условия после заказа (скидки, бонусы, доплата).
- Статус товара не меняется на «нет в наличии» при ограниченных запасах.
- Отсутствие обновления данных товара в админке после успешной оплаты.
Пошаговое решение: изменение цены и статуса наличия через хук WooCommerce
1. Использование хука woocommerce_thankyou для запуска кода после успешного заказа
Хук woocommerce_thankyou срабатывает после оформления заказа и подходит для модификации данных товара.
add_action('woocommerce_thankyou', 'custom_update_product_after_order', 10, 1);2. Реализация функции обновления цены и наличия
В функции получаем заказ, перебираем товары, меняем цену и наличие.
function custom_update_product_after_order($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$product = wc_get_product($product_id);
if (!$product) continue;
// Пример: уменьшаем цену на 10% после заказа
$regular_price = floatval($product->get_regular_price());
$new_price = $regular_price * 0.9;
$product->set_price($new_price);
$product->set_regular_price($new_price);
// Пример: меняем статус наличия на "нет в наличии"
$product->set_stock_status('outofstock');
$product->save();
}
}3. Размещение кода
Добавьте этот код в functions.php вашей дочерней темы или в отдельный плагин, чтобы изменения были постоянными и не слетели при обновлении.
Проверка результата после внедрения
- Оформите тестовый заказ на сайте с товаром, для которого хотите поменять цену и наличие.
- Перейдите в админку WooCommerce – раздел «Товары» и найдите этот товар.
- Проверьте, что цена товара уменьшилась на 10%, а статус наличия изменился на «нет в наличии».
- Обновите страницу товара на сайте, чтобы убедиться, что отображается новая цена и статус.
Частые ошибки и как исправить
- Ничего не меняется после заказа
Проверьте, вызывается ли функция: добавьтеerror_log('custom_update_product_after_order вызван');в функцию и смотрите логи PHP. Возможно, хук не срабатывает из-за кеширования или конфликтов. - Изменения в цене не отображаются на сайте
Очистите кеш сайта и браузера. Если используется кэширование на уровне сервера (например, Varnish, Redis), обновите его. - Наличие не меняется
Убедитесь, что у товара включён учёт запасов (manage_stock= true). Иначе статус наличия не обновится. - Ошибка при сохранении продукта
Проверьте права пользователя и отсутствие конфликтов с другими плагинами, которые могут блокировать сохранение данных.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы в функции, вызываемой по хуку
woocommerce_thankyou, чтобы не замедлять процесс оформления заказа. - Проверяйте права доступа, если функция расширяется для фронтенд-запросов или AJAX.
- Для сложного пересчёта цен лучше использовать встроенные фильтры WooCommerce, например,
woocommerce_product_get_price, чтобы не менять базовые данные товара. - Для массового обновления товаров после заказа лучше запланировать очередь через WP-Cron, чтобы избежать блокировки пользователя.
Сравнение методов изменения цены и наличия товара
| Метод | Плюсы | Минусы |
|---|---|---|
Изменение внутри woocommerce_thankyou | Простота реализации, мгновенный эффект | Риск замедления оформления заказа, возможны конфликты |
| Использование WP-Cron для отложенного обновления | Не влияет на время оформления заказа, безопасно для большого объёма | Может быть задержка обновления, сложнее в реализации |
| Фильтры для динамического изменения цены (без сохранения) | Не меняет базу данных, удобно для скидок | Не меняет статус наличия, ограничен функционал |