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

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

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

Для диагностики ситуации используйте SQL-запросы или сторонние инструменты для просмотра купонов и их статусов. Например, в базе данных купоны хранятся как тип записи shop_coupon в таблице wp_posts. Метаданные купонов (срок действия, статус) — в wp_postmeta.

Проверка купонов с истекшим сроком действия через SQL

SELECT p.ID, p.post_title, pm.meta_value AS expiry_date
FROM wp_posts p
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = 'expiry_date'
WHERE p.post_type = 'shop_coupon'
AND pm.meta_value < CURDATE();

Этот запрос выведет купоны, срок действия которых прошёл. Если у вас много таких записей — пора автоматизировать их удаление.

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

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

1. Добавление функции удаления купонов

function wpid_delete_expired_coupons() {
    $today = date('Y-m-d');

    $args = [
        'post_type'      => 'shop_coupon',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => 'expiry_date',
                'value'   => $today,
                'compare' => '<',
                'type'    => 'DATE',
            ],
        ],
        'fields'         => 'ids',
    ];

    $expired_coupons = get_posts($args);

    foreach ($expired_coupons as $coupon_id) {
        wp_delete_post($coupon_id, true);
    }
}

2. Регистрация крон-задачи для регулярного запуска

add_action('wp_loaded', function() {
    if (!wp_next_scheduled('wpid_delete_expired_coupons_cron')) {
        wp_schedule_event(time(), 'daily', 'wpid_delete_expired_coupons_cron');
    }
});

add_action('wpid_delete_expired_coupons_cron', 'wpid_delete_expired_coupons');

3. Очистка крон-задачи при деактивации плагина или темы

register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wpid_delete_expired_coupons_cron');
});

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

Для проверки работы решения:

  • Подождите выполнение крон-задачи (по умолчанию раз в сутки).
  • Или запустите вручную функцию в тестовом режиме, вызвав wpid_delete_expired_coupons() через админ-панель или WP-CLI.
  • Проверьте в базе данных таблицу wp_posts, что купоны с прошедшей датой expiry_date удалены.
  • Убедитесь, что в панели WooCommerce > Купоны устаревшие записи отсутствуют.

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

  • Неверный формат даты в метаполе expiry_date: убедитесь, что используется формат YYYY-MM-DD, иначе сравнение дат не сработает.
  • Крон-задача не запускается: проверьте, что WP-Cron активен и не блокируется. Используйте плагины для мониторинга крона, например WP Crontrol.
  • Удаляются не те купоны: проверьте условие в meta_query, возможно, поле expiry_date заполнено некорректно или отсутствует у некоторых купонов.
  • Ошибка прав доступа: функция wp_delete_post требует прав администратора. Запускать код следует с админскими правами или в контексте, где права достаточны.

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

  • Всегда делайте резервную копию базы данных перед массовым удалением данных.
  • Добавляйте логирование операций удаления для отслеживания изменений.
  • Если купонов много (сотни и более), обрабатывайте их по частям с помощью пагинации, чтобы избежать превышения лимитов памяти и времени выполнения.
  • Используйте WP-Cron в связке с системным cron на сервере для надёжности.

Сравнение методов удаления купонов

МетодПлюсыМинусы
Ручное удаление через админку WooCommerceПросто для нескольких купоновНе подходит при большом количестве, долго
SQL-запрос на удаление напрямуюОчень быстроОпасно без бэкапа, требует знаний SQL
Автоматизация через WP-Cron и PHP (описано выше)Автоматически, безопасно, настраиваемоТребует настройки и тестирования
Как удалить или изменить авторские данные в WordPress программно
05.02.2026
Как сделать автоматический редирект после входа в WordPress
09.04.2026
Как добавить многоязычность в WordPress без плагинов
12.02.2026
WooCommerce: исключение товаров из определённых категорий из корзины
13.05.2026
WooCommerce: как автоматически удалять товары после оплаты
05.07.2026