Как автоматизировать удаление неиспользуемых купонов в WooCommerce

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

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

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

Купон считается неиспользуемым, если по нему не было ни одной успешной оплаты. WooCommerce хранит данные об использовании купонов в метаполях заказов и в таблице wp_woocommerce_order_items. Чтобы проверить, какие купоны не использовались, можно выполнить SQL-запрос:

SELECT p.ID, p.post_title FROM wp_posts p WHERE p.post_type = 'shop_coupon' AND p.ID NOT IN ( SELECT order_item_meta.meta_value FROM wp_woocommerce_order_items AS order_items JOIN wp_woocommerce_order_itemmeta AS order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id WHERE order_items.order_item_type = 'coupon' AND order_item_meta.meta_key = 'coupon_id' )

Этот запрос вернёт ID и названия купонов, которые не применялись ни в одном заказе.

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

Для автоматизации удаления таких купонов в WooCommerce можно использовать WP-Cron и кастомную функцию, которая будет выполнять SQL-запрос и удалять соответствующие купоны.

1. Создаём функцию удаления

function wc_delete_unused_coupons() {
    global $wpdb;
    // Получаем ID неиспользуемых купонов
    $unused_coupons = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p WHERE p.post_type = 'shop_coupon' AND p.ID NOT IN (
            SELECT order_item_meta.meta_value FROM {$wpdb->prefix}woocommerce_order_items AS order_items
            JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id
            WHERE order_items.order_item_type = 'coupon' AND order_item_meta.meta_key = 'coupon_id'
        )"
    );

    if (!empty($unused_coupons)) {
        foreach ($unused_coupons as $coupon_id) {
            wp_delete_post($coupon_id, true); // Полное удаление
        }
    }
}

2. Регистрируем событие WP-Cron

add_action('wc_cleanup_unused_coupons_event', 'wc_delete_unused_coupons');

if (!wp_next_scheduled('wc_cleanup_unused_coupons_event')) {
    // Запускаем еженедельно
    wp_schedule_event(time(), 'weekly', 'wc_cleanup_unused_coupons_event');
}

3. Добавляем очистку при деактивации плагина или темы

function wc_cleanup_deactivation() {
    wp_clear_scheduled_hook('wc_cleanup_unused_coupons_event');
}
register_deactivation_hook(__FILE__, 'wc_cleanup_deactivation');

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

  • В админке WooCommerce > Купоны убедитесь, что неиспользуемые купоны исчезли.
  • Запустите функцию вручную для проверки, вызвав wc_delete_unused_coupons(); через WP-CLI или в тестовом коде.
  • Проверьте логи ошибок сервера и WordPress для убедительности, что удаление прошло без сбоев.
  • Сделайте резервную копию базы данных перед запуском, чтобы иметь возможность отката.

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

  • Функция не запускается автоматически: Проверьте, работает ли WP-Cron на сайте. Иногда на локальных или нестандартных серверах WP-Cron отключён. Для проверки вручную выполните wp cron event run wc_cleanup_unused_coupons_event через WP-CLI.
  • Удаляются купоны, которые используются: Проверьте корректность SQL-запроса, особенно метаполя coupon_id. Иногда плагины могут менять структуру, в таком случае адаптируйте запрос под вашу базу.
  • Высокая нагрузка при удалении большого количества купонов: Делайте удаление партиями, например, по 50 купонов за раз, используя array_chunk и лимит SQL-запроса.

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

  • Перед автоматическим удалением купонов всегда делайте резервное копирование базы данных.
  • Добавьте логирование удалённых купонов, чтобы отслеживать изменения. Например, записывайте ID и названия в файл или таблицу лога.
  • Для улучшения производительности используйте подготовленные запросы и избегайте прямого удаления большого объёма данных в одном запросе.
  • Реализуйте проверку ролей пользователя, чтобы функция могла запускаться только администратором или через WP-Cron.

Сравнение вариантов удаления неиспользуемых купонов

СпособПреимуществаНедостатки
SQL-запрос вручнуюБыстро, гибкоРиск ошибки, требует знаний SQL
Плагин очисткиУдобно, готовое решениеМожет создавать нагрузку, не всегда бесплатно
WP-Cron с кастомным скриптомАвтоматизация, контроль над процессомТребует программирования, настройка WP-Cron
Как использовать метод wpcommunity_database_cleanup для удаления пустых таблиц в базе данных WordPress
01.03.2026
Как сделать автоматическое удаление старых мета данных в WordPress
11.03.2026
Как создать автоматическую систему отзывов с подтверждением в WordPress
02.02.2026
Как удалить варианты товаров WooCommerce при удалении атрибута
10.05.2026
Как использовать REST API WordPress для получения пользовательских данных
01.01.2026

Задать вопрос о вордпресс, получить ответ - это все можно сделать в нашем сообществе WP. Сайт в данный момент в разработке, изучите ссылки ниже: