Проблема: промо-коды остаются активными после использования
В WooCommerce стандартно купоны (промо-коды) можно ограничить по количеству использований, но иногда нужно более гибко: автоматически деактивировать купон сразу после первого успешного использования конкретным пользователем или вообще сразу после первой покупки с этим купоном, чтобы исключить повторное использование. Это особенно актуально для персональных акций или одноразовых предложений.
Диагностика проблемы
Чтобы понять, работает ли отключение купона после использования, проверьте следующие моменты:
- Сколько раз можно использовать купон в настройках WooCommerce (максимальное количество использований купона).
- Есть ли ограничения по пользователям (например, «Ограничить использование для одного пользователя»).
- Проверить, не сохраняется ли купон в сессии после оформления заказа.
Однако WooCommerce не отключает купон автоматически сразу после успешного заказа — он просто учитывает количество использований. Если нужно именно автоматическое отключение (например, после первого использования купона всеми пользователями), придется реализовать дополнительную логику.
Пошаговое решение: автоматическое отключение купона после первой покупки с ним
Реализуем хук, который при смене статуса заказа проверяет наличие купона и отключает его, если он был применён.
add_action('woocommerce_order_status_completed', 'disable_coupon_after_first_use', 10, 1);
function disable_coupon_after_first_use( $order_id ) {
if ( ! $order_id ) return;
$order = wc_get_order( $order_id );
if ( ! $order ) return;
$used_coupons = $order->get_used_coupons();
if ( empty( $used_coupons ) ) return;
foreach ( $used_coupons as $coupon_code ) {
$coupon = new WC_Coupon( $coupon_code );
if ( ! $coupon->get_id() ) continue;
// Деактивируем купон
$coupon->set_usage_limit( 0 );
$coupon->save();
}
}
Объяснение:
- Хук
woocommerce_order_status_completedсрабатывает при смене статуса заказа на «завершён». - Получаем список купонов, использованных в заказе.
- Для каждого купона устанавливаем лимит использования в 0, что фактически отключает его.
Проверка результата после внедрения
- Создайте тестовый купон с неограниченным количеством использований.
- Сделайте заказ с использованием этого купона, переведите заказ в статус «завершён».
- Попробуйте применить тот же купон в новом заказе — он должен быть недоступен.
Для визуальной проверки можно зайти в админку WooCommerce в раздел «Купоны» и проверить поле «Максимальное количество использований» — после использования должно быть установлено 0.
Частые ошибки и способы их исправления
- Купон не отключается после применения: проверьте, что заказ действительно переводится в статус «завершён». Если используется другой статус, например «обрабатывается», замените хук на
woocommerce_order_status_processingили добавьте обработку нескольких статусов. - Купон не применяется к заказу: удостоверьтесь, что купон активен и применён корректно до завершения заказа.
- Лимит использования не меняется: убедитесь, что функция сохраняет объект купона методом
$coupon->save(), без этого изменения не сохранятся.
Практические советы для безопасности и производительности
- Не используйте отключение купонов сразу по статусу «обрабатывается», если у вас есть автоматическая отмена заказов — чтобы не заблокировать купон зря.
- Добавьте логирование отключения купонов, чтобы отслеживать изменения в продакшене.
- Если у вас много заказов с купонами, оптимизируйте код, например, добавляя проверку только для нужных купонов по ID или меткам.
Альтернативы: плагин vs. кастомный код
| Вариант | Плюсы | Минусы |
|---|---|---|
| Кастомный код (как выше) | Гибкость, полный контроль, бесплатно | Требует поддержки при обновлениях, возможны ошибки без опыта |
| Плагин для управления купонами с расширенными правилами | Простота настройки, дополнительные функции (ограничения по времени, пользователям) | Платные или сложные, могут влиять на производительность |