wpcat.ru wordpress WPCat.ru

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

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

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

Чтобы выяснить, есть ли нерабочие купоны, выполните запрос к базе данных или используйте WP CLI:

wp post list --post_type=shop_coupon --fields=ID,post_title,post_status

Далее, проверьте метаданные купонов, особенно date_expires, usage_count и usage_limit, чтобы определить устаревшие или превышающие лимиты купоны.

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

1. Определение нерабочих купонов по критериям

В WooCommerce купоны хранятся как посты типа shop_coupon с метаданными, содержащими параметры купона. Для автоматического удаления нам нужно проверить следующие условия:

  • Срок действия купона date_expires установлен и прошел
  • Лимит использования usage_limit установлен и достигнут (usage_count >= usage_limit)
  • Статус купона post_status не publish (например, trash или draft)

2. Код для автоматического удаления нерабочих купонов

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

function delete_expired_and_limit_reached_coupons() {
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    $args = [
        'post_type'      => 'shop_coupon',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
    ];

    $coupons = get_posts( $args );
    $now = time();
    $deleted_count = 0;

    foreach ( $coupons as $coupon ) {
        $coupon_id = $coupon->ID;

        $date_expires = get_post_meta( $coupon_id, 'date_expires', true );
        $usage_limit = get_post_meta( $coupon_id, 'usage_limit', true );
        $usage_count = get_post_meta( $coupon_id, 'usage_count', true );

        $expired = $date_expires && $now > $date_expires;
        $limit_reached = $usage_limit && $usage_count >= $usage_limit;

        if ( $expired || $limit_reached ) {
            wp_trash_post( $coupon_id );
            $deleted_count++;
        }
    }

    if ( defined( 'WP_CLI' ) && WP_CLI ) {
        WP_CLI::success( "Deleted $deleted_count expired or limit reached coupons." );
    }
}

// Для запуска вручную через WP-CLI
if ( defined( 'WP_CLI' ) && WP_CLI ) {
    WP_CLI::add_command( 'wc-delete-bad-coupons', 'delete_expired_and_limit_reached_coupons' );
}

// Или запускать автоматически раз в сутки через cron
add_action( 'woocommerce_daily_cleanup', 'delete_expired_and_limit_reached_coupons' );

if ( ! wp_next_scheduled( 'woocommerce_daily_cleanup' ) ) {
    wp_schedule_event( time(), 'daily', 'woocommerce_daily_cleanup' );
}

3. Запуск и проверка

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

  1. Запустите команду WP-CLI (если доступна): wp wc-delete-bad-coupons
  2. Или дождитесь ежедневного крон-запуска (или вызовите вручную через do_action('woocommerce_daily_cleanup'))
  3. Проверьте, что в админке WooCommerce купоны с истекшим сроком и достигшими лимиты использования были перемещены в корзину
  4. Для дополнительной проверки выполните запрос к базе:
SELECT ID, post_title FROM wp_posts WHERE post_type = 'shop_coupon' AND post_status = 'publish';

Отсутствие просроченных и полностью использованных купонов в списке означает, что очистка сработала корректно.

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

  • Купоны не удаляются: проверьте, что функция запускается (cron или WP-CLI), и что у пользователя или сервера есть права на удаление постов.
  • Неправильное время проверки срока: WooCommerce хранит date_expires в формате UNIX timestamp, убедитесь, что сравнение с time() корректно.
  • Купоны с неустановленным сроком удаляются: код игнорирует купоны без даты истечения, чтобы их не удалять ошибочно.
  • Удаление вместо перемещения в корзину: рекомендуем использовать wp_trash_post(), чтобы можно было восстановить купоны при ошибке.

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

  • Запускайте очистку не чаще раза в сутки, чтобы не нагружать сервер.
  • Резервное копирование базы перед массовыми операциями обязательно.
  • Используйте WP-CLI для ручного запуска и отладки — это быстрее и безопаснее, чем запуск через веб-интерфейс.
  • Если купонов очень много, используйте постраничный запрос с posts_per_page и смещением, чтобы избежать превышения лимита памяти.

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

МетодПлюсыМинусыКомпромисс
Ручное удаление в админкеПростота, контрольТрудозатратно, риск пропускаПодходит для маленьких магазинов
Плагины авточисткиАвтоматизация, удобствоДоп. нагрузка, совместимостьИспользуйте проверенные плагины
Код в functions.php (как в статье)Контроль, бесплатность, кастомизацияТребует знаний, поддержка на васОптимальный баланс для разработчиков
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее