Диагностика задачи: зачем менять стоимость и наличие товара автоматически
В 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, возможны ошибки при неправильном коде |
| Плагины скидок и управления запасами | Готовые решения с настройками в админке | Простота настройки, поддержка | Зависимость от стороннего кода, нагрузка, стоимость |
| Комбинация кода и плагинов | Код для специфичных задач + плагины для остального | Оптимальный баланс гибкости и удобства | Сложность поддержки, необходимость тестирования |