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

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

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

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

Как определить неактивные купоны

Под неактивными купонами понимаются купоны, которые:

  • Истекли по дате date_expires;
  • Достигли лимита использования usage_limit;
  • Они деактивированы вручную (статус «черновик» или удалён).

WooCommerce хранит купоны как тип записи shop_coupon, параметры купона — в метаполях.

Пример SQL-запроса для проверки просроченных купонов

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

Этот запрос покажет купоны с датой истечения раньше текущего времени.

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

Для автоматизации удаления неактивных купонов пишем функцию на PHP, которая:

  1. Получает все купоны с истекшим сроком действия или достигшим лимитом использования;
  2. Удаляет эти купоны из базы;
  3. Запускает этот процесс автоматически по расписанию.

Код для файла functions.php или собственного плагина

function wplist_delete_expired_or_used_coupons() {
    $args = [
        'post_type'      => 'shop_coupon',
        'posts_per_page' => -1,
        'meta_query'     => [
            'relation' => 'OR',
            [
                'key'     => 'date_expires',
                'value'   => time(),
                'compare' => '<',
                'type'    => 'NUMERIC',
            ],
            [
                'key'     => 'usage_count',
                'value'   => 0,
                'compare' => '>',
                'type'    => 'NUMERIC',
            ],
        ],
    ];

    $coupons = get_posts($args);

    foreach ($coupons as $coupon) {
        $usage_limit = get_post_meta($coupon->ID, 'usage_limit', true);
        $usage_count = get_post_meta($coupon->ID, 'usage_count', true);

        $date_expires = get_post_meta($coupon->ID, 'date_expires', true);

        $expired = $date_expires && $date_expires < time();
        $used_up = $usage_limit && $usage_count >= $usage_limit;

        if ($expired || $used_up) {
            wp_delete_post($coupon->ID, true); // принудительное удаление
        }
    }
}

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

// Подключаем функцию к событию
add_action('wplist_coupon_cleanup_hook', 'wplist_delete_expired_or_used_coupons');

// Очистка при деактивации
function wplist_deactivate_coupon_cleanup() {
    wp_clear_scheduled_hook('wplist_coupon_cleanup_hook');
} // добавить вызов при деактивации плагина или темы

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

Для проверки удаленных купонов:

  • В админке WooCommerce перейдите в раздел «Купоны» и проверьте, что просроченные и использованные купоны отсутствуют.
  • Запустите вручную функцию удаления через do_action('wplist_coupon_cleanup_hook'); в консоли WP-CLI: wp eval "do_action('wplist_coupon_cleanup_hook');".
  • Проверьте логи ошибок и базу данных — купоны должны исчезать.

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

  • Ошибка: Купоны не удаляются.
    Причина: Неправильные мета-ключи или неверные условия в meta_query. Проверяйте, что ключи date_expires, usage_limit, usage_count соответствуют вашей версии WooCommerce и базе данных.
  • Ошибка: Запланированное событие WP-Cron не запускается.
    Решение: Проверьте, не отключен ли WP-Cron в wp-config.php. Можно запускать cron вручную через системный cron или WP-CLI.
  • Ошибка: Купоны удаляются преждевременно.
    Решение: Добавьте дополнительную проверку на статус купона (post_status должен быть publish).

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

  • Вызывайте функцию удаления с интервалом не чаще одного раза в сутки, чтобы не нагружать базу.
  • Перед удалением делайте резервную копию базы данных.
  • Добавьте логирование удаленных купонов в отдельный файл для аудита.
  • Для крупных магазинов с тысячами купонов используйте пакетную обработку с posts_per_page и смещением (offset), чтобы не перегружать память.
  • Можно интегрировать Clearfy Pro от WPShop для очистки базы и оптимизации после удаления.

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

МетодПлюсыМинусыПример использования
Плагин для очистки базы Простота установки, готовый функционал Может быть избыточным, тяжелым, без точного контроля Clearfy Pro — https://wpshop.ru/plugins/clearfy?utm_source=wplist.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udalenie-neaktivnyh-kuponov
Код на PHP с WP-Cron Максимальный контроль, гибкость, нет зависимости от плагинов Требует навыков и поддержки Пример из статьи выше
Ручное удаление через админку Безопасно, ничего не ломается Трудоемко, не подходит для больших магазинов Админка WooCommerce > Купоны
Как удалить проблемные промышленные кэши в WordPress
12.04.2026
WooCommerce: как автоматически удалять неактивные купоны
17.07.2026
Как удалить кеш в WordPress: лучшие методы для разработчиков и администраторов
09.11.2025
Как удалить проблемные виджеты в WordPress без ошибок и потери данных
23.03.2026
WooCommerce: как удалить отзывы только с определённых товаров
09.06.2026