WooCommerce: автоматическое удаление просроченных купонов

Диагностика проблемы с просроченными купонами в WooCommerce

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

Как проверить наличие просроченных купонов

  • Перейдите в WooCommerce > Купоны.
  • Смотрите дату окончания действия купона в поле Дата истечения.
  • Если купон с истекшей датой не удален и доступен для применения, значит проблема актуальна.

Пошаговое решение: автоматическое удаление или деактивация просроченных купонов

Для автоматизации удаления просроченных купонов в WooCommerce можно использовать хуки WordPress и WP-Cron. Рассмотрим пример кода, который деактивирует купоны с истекшей датой окончания каждый день.

<?php
// Функция деактивации просроченных купонов
function deactivate_expired_coupons() {
    $args = [
        'post_type'      => 'shop_coupon',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => 'expiry_date',
                'value'   => date('Y-m-d'),
                'compare' => '<',
                'type'    => 'DATE',
            ],
        ],
        'post_status'    => 'publish',
    ];

    $expired_coupons = get_posts($args);

    foreach ($expired_coupons as $coupon) {
        // Меняем статус на черновик, чтобы купон не был активен
        wp_update_post([
            'ID'          => $coupon->ID,
            'post_status' => 'draft',
        ]);
    }
}

// Регистрируем событие WP-Cron при активации плагина или темы
function register_deactivate_expired_coupons_cron() {
    if (!wp_next_scheduled('deactivate_expired_coupons_daily')) {
        wp_schedule_event(time(), 'daily', 'deactivate_expired_coupons_daily');
    }
}
add_action('wp', 'register_deactivate_expired_coupons_cron');

// Хук для выполнения функции
add_action('deactivate_expired_coupons_daily', 'deactivate_expired_coupons');

// Очистка расписания при деактивации
function clear_deactivate_expired_coupons_cron() {
    $timestamp = wp_next_scheduled('deactivate_expired_coupons_daily');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'deactivate_expired_coupons_daily');
    }
}
// Добавить clear_deactivate_expired_coupons_cron() в деактивацию плагина или темы
?>

Этот код автоматически переводит купоны с истекшей датой в статус draft, что исключает их использование. Вместо удаления сохраняется история купонов, что часто важно для аналитики.

Альтернативный подход: полное удаление просроченных купонов

Если нужно именно удалять купоны, замените часть с wp_update_post на:

wp_delete_post($coupon->ID, true);

Но будьте осторожны — удаление необратимо и может повлиять на отчеты.

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

  • Добавьте купон с датой окончания, которая уже прошла.
  • Запустите вручную функцию deactivate_expired_coupons() через консоль WP-CLI или временно вызвав ее в коде.
  • Проверьте, что статус купона изменился с publish на draft или купон удалился.
  • Убедитесь, что купон больше не отображается в списке активных купонов и не применяется на сайте.
  • Проверьте, что запланированное задание WP-Cron работает (через wp cron event list в WP-CLI или плагин WP Crontrol).

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

  • Купоны не деактивируются автоматически: проверьте, что WP-Cron работает на сервере. На некоторых хостингах cron не срабатывает без внешних запросов, можно настроить системный cron или использовать плагин WP Crontrol для теста.
  • Дата окончания купона не сохраняется: WooCommerce хранит дату окончания в мета-данных expiry_date. Убедитесь, что купон создан с корректным форматом даты Y-m-d.
  • Удаление купонов приводит к потере данных: вместо удаления используйте смену статуса на draft, чтобы сохранить историю.
  • Функция не находит просроченные купоны: проверьте правильность meta_query и формат даты. Можно вывести отладочную информацию через error_log(print_r($expired_coupons,true));.

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

  • Не удаляйте купоны без резервного копирования базы данных.
  • При большом количестве купонов делайте пагинацию в запросе get_posts, чтобы не перегружать память.
  • Запланированное задание запускайте не чаще раза в сутки, чтобы не создавать лишних нагрузок.
  • Используйте Clearfy Pro для дополнительной оптимизации WooCommerce и очистки базы.

Сравнение вариантов решения

МетодОписаниеПлюсыМинусы
Деактивация (статус draft)Меняет статус купона, оставляя его в базеСохраняется история, легко восстановить купонКупон остается в базе, нужно фильтровать при выводе
Удаление купоновПолное удаление из базыНет мусора в базе, чистый список купоновПотеря истории, необратимо, риск для отчетов
WooCommerce: решение проблемы неработающей сборки заказа при AJAX добавлении товара
14.06.2026
WooCommerce: решение проблемы автоматического обновления корзины при изменении вариаций товара
17.07.2026
WooCommerce: автоматическое удаление просроченных купонов
29.07.2026
WooCommerce: решение проблемы невозможности изменения стоимости товара при AJAX добавлении в корзину
27.06.2026
Как отключить отложенную загрузку картинок в WordPress
13.12.2025