WooCommerce: автоматическое изменение стоимости и наличия товара при оформлении заказа

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

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

Пошаговое решение: как реализовать автоматическое изменение цены и наличия товара

1. Изменение цены товара в корзине

Для изменения цены товара в корзине во время оформления используйте хук woocommerce_before_calculate_totals. Важно проверять, что изменение происходит только один раз, чтобы избежать дублирования скидок.

add_action('woocommerce_before_calculate_totals', 'custom_change_cart_item_price', 20, 1);
function custom_change_cart_item_price($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        // Пример: скидка 10% для товаров с ID 123
        if ($product->get_id() == 123) {
            $original_price = $product->get_regular_price();
            $new_price = $original_price * 0.9;
            $product->set_price($new_price);
        }
    }
}

2. Автоматическое изменение наличия товара после успешного оформления заказа

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

add_action('woocommerce_order_status_completed', 'custom_update_product_stock_status_after_order', 10, 1);
function custom_update_product_stock_status_after_order($order_id) {
    $order = wc_get_order($order_id);
    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if (!$product) continue;
        // Устанавливаем статус "нет в наличии"
        $product->set_stock_status('outofstock');
        $product->save();
    }
}

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

  • Добавьте в корзину товар с ID, указанным в коде (например, 123), и проверьте, что цена изменилась на 10% меньше.
  • Оформите заказ и подтвердите оплату (для теста можно использовать режим Sandbox или тестовый платеж). После смены статуса заказа на "завершён", убедитесь, что товар стал отображаться как "нет в наличии" в каталоге.
  • Проверьте, что в админке товара обновился статус наличия и цена отображается корректно.

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

  • Изменение цены в админке или повторное применение скидки: всегда проверяйте, что изменение цены происходит только на фронтенде и только один раз, чтобы избежать двойных скидок.
  • Не обновляется статус наличия товара после оформления заказа: убедитесь, что хук срабатывает — для этого можно добавить error_log внутри функции. Также проверьте, что у товара включён учёт запасов (manage_stock).
  • Кэширование мешает видеть изменения: очистите кэш сайта и браузера после внесения изменений.
  • Влияние других плагинов: отключите временно плагины кэширования и оптимизации, чтобы проверить, не мешают ли они.

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

  • Избегайте изменения цены непосредственно в объекте товара глобально, меняйте цену только в корзине, чтобы не влиять на базу данных.
  • Для массовых изменений статусов товаров после заказов используйте очередь задач или WP-Cron, чтобы не перегружать сервер при большом количестве заказов.
  • Проверяйте права пользователя перед изменением данных, если функции вызываются с фронтенда.
  • Для сложных условий скидок и управления наличием рассмотрите возможность интеграции с плагином Clearfy Pro для оптимизации и управления дублями и ресурсами сайта.

Сравнение вариантов реализации

МетодОписаниеПлюсыМинусы
Код на хуках WooCommerceИспользование стандартных хуков для изменения цены и статусаГибко, бесплатно, без плагиновТребует навыков PHP, возможны ошибки при неправильном коде
Плагины скидок и управления запасамиГотовые решения с настройками в админкеПростота настройки, поддержкаЗависимость от стороннего кода, нагрузка, стоимость
Комбинация кода и плагиновКод для специфичных задач + плагины для остальногоОптимальный баланс гибкости и удобстваСложность поддержки, необходимость тестирования
Как создать динамические формы в WordPress с помощью AJAX
23.12.2025
Узнать правила изменения URL в WordPress без потери трафика
03.11.2025
Как создать динамические отзывы с оценками в WordPress без плагинов
09.01.2026
Как отключить кэширование страниц в WordPress для разработки и отладки
21.03.2026
Как оценивать скорость загрузки страниц WordPress: практические методы и плагины
30.03.2026

На оформлении, скоро здесь появится полноценный ресурс