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

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

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

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

Недействительными считаются купоны, у которых установлен статус draft, trash, либо дата окончания действия уже прошла. Для проверки можно использовать SQL-запрос к базе данных:

SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'shop_coupon' AND (post_status = 'draft' OR post_status = 'trash' OR ID IN (SELECT post_id FROM wp_postmeta WHERE meta_key = 'expiry_date' AND meta_value < UNIX_TIMESTAMP()));

Этот запрос покажет купоны, которые неактивны или просрочены (если дата хранения в мета полях в формате timestamp).

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

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

Добавьте следующий код в functions.php вашей темы или в кастомный плагин:

function wpmy_delete_expired_and_inactive_coupons() {
    $args = array(
        'post_type' => 'shop_coupon',
        'posts_per_page' => -1,
        'post_status' => array('draft', 'trash', 'publish'),
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => 'expiry_date',
                'value' => time(),
                'compare' => '<',
                'type' => 'NUMERIC',
            ),
            array(
                'key' => 'expiry_date',
                'compare' => 'NOT EXISTS',
            ),
        ),
    );
    $coupons = get_posts($args);
    foreach ($coupons as $coupon) {
        if ($coupon->post_status !== 'publish' || (get_post_meta($coupon->ID, 'expiry_date', true) < time())) {
            wp_delete_post($coupon->ID, true); // Полное удаление
        }
    }
}

2. Запуск функции по расписанию (WP-Cron)

Добавьте планировщик задач, который будет запускать функцию раз в сутки:

if (!wp_next_scheduled('wpmy_daily_coupon_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpmy_daily_coupon_cleanup');
}
add_action('wpmy_daily_coupon_cleanup', 'wpmy_delete_expired_and_inactive_coupons');

3. Ручной запуск для тестирования

Для проверки работы функции вызовите её напрямую один раз, например, через админский файл или временно в functions.php:

add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['run_coupon_cleanup'])) {
        wpmy_delete_expired_and_inactive_coupons();
        echo 'Очистка купонов выполнена';
        exit;
    }
});

После этого введите в адресной строке: https://ваш_сайт/wp-admin/?run_coupon_cleanup=1

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

  • В админке WooCommerce перейдите в раздел купонов и убедитесь, что неактивные и просроченные купоны удалены.
  • Проверьте базу данных, выполнив SQL-запрос из раздела диагностики — результаты должны быть пустыми для удалённых купонов.
  • Через 24 часа проверьте лог сервера или создайте логирование в функции удаления (например, запись ID удалённых купонов в файл или в системный лог).

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

  • Купоны не удаляются: проверьте, что функция wp_delete_post() вызывается с параметром true для полного удаления, а не только перемещения в корзину.
  • Функция не запускается по расписанию: убедитесь, что WP-Cron работает (например, посмотрите расписание с помощью плагина WP Crontrol). Если сайт не получает посетителей, cron может не запускаться — рассмотрите настройку системного cron на сервере.
  • Удаляются не те купоны: внимательно проверьте условия в meta_query, особенно формат даты в мета-поле expiry_date. Если дата хранится в формате YYYY-MM-DD, нужна трансформация в timestamp.
  • Ошибка прав доступа при ручном запуске: проверяйте права пользователя через current_user_can('manage_woocommerce') или аналогичные.

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

  • Создайте резервную копию базы данных перед внедрением автоматического удаления.
  • Добавьте логирование удалённых купонов для аудита и восстановления данных при необходимости.
  • Для больших магазинов с тысячами купонов разбивайте удаление на батчи с помощью параметра posts_per_page, чтобы не превышать лимит памяти и времени выполнения.
  • Следите за нагрузкой на сервер при запуске cron — лучше запускать в ночное время.

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

МетодПлюсыМинусы
Ручное удаление через админкуПростота, безопасностьТрудозатратно, не подходит для большого количества купонов
Плагины очистки базыАвтоматизация, удобный интерфейсМожет удалять лишнее, нагрузка на сайт, зависимость от сторонних решений
Код с автоматическим удалением через WP-CronТонкая настройка, без лишних плагинов, контроль процессаТребует навыков разработки, возможны ошибки при некорректном коде
Как создать функцию автоматического расширения категорий в WordPress
25.12.2025
WooCommerce: как правильно установить лимит на количество товаров в корзине
07.06.2026
Как использовать WP REST API для автоматической обновы продуктов WooCommerce
21.04.2026
Как установить просмотр и управление ролями пользователей в WordPress
24.02.2026
WooCommerce: правильное отображение вариаций товаров — практическое руководство
17.05.2026