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

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

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

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

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

1. Создаём функцию для удаления заказов со статусом 'completed'

В этом примере мы удалим все заказы, которые имеют статус completed старше 30 дней.

function wc_delete_completed_orders_older_than_30_days() {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    $orders = wc_get_orders(array(
        'status' => 'completed',
        'date_created' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids'
    ));

    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        wp_trash_post($order_id); // перемещаем заказ в корзину, чтобы избежать резких удалений
    }
}

2. Добавляем задачу в WP-Cron для регулярного удаления

function wc_schedule_order_cleanup() {
    if (!wp_next_scheduled('wc_delete_old_completed_orders_hook')) {
        wp_schedule_event(time(), 'daily', 'wc_delete_old_completed_orders_hook');
    }
}
add_action('wp', 'wc_schedule_order_cleanup');

add_action('wc_delete_old_completed_orders_hook', 'wc_delete_completed_orders_older_than_30_days');

3. Очистка корзины заказов (trash) для окончательного удаления

WordPress не удаляет записи из корзины сразу, поэтому нужно настроить регулярное удаление.

function wc_empty_orders_trash() {
    global $wpdb;
    $sql = "DELETE FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'trash'";
    $wpdb->query($sql);
}
add_action('wc_empty_orders_trash_hook', 'wc_empty_orders_trash');

if (!wp_next_scheduled('wc_empty_orders_trash_hook')) {
    wp_schedule_event(time(), 'weekly', 'wc_empty_orders_trash_hook');
}

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

  • В админке WooCommerce перейдите в Заказы и убедитесь, что оплаченные заказы старше 30 дней отображаются в корзине или удалены.
  • Запустите вручную функцию wc_delete_completed_orders_older_than_30_days() через WP-CLI или временно вызовите её в теме, чтобы проверить удаление.
  • Проверьте логи сервера и сайт на ошибки после запуска задач WP-Cron.
  • Убедитесь, что WP-Cron работает: в файле wp-config.php не отключен, либо настройте системный cron для вызова wp-cron.php.

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

  • Заказы не удаляются: Проверьте, что статус заказа действительно completed. Некоторые оплаты могут оставлять статус processing или on-hold, их нужно учитывать отдельно.
  • WP-Cron не запускается: На хостинге отключён WP-Cron? Настройте системный cron для вызова wp-cron.php или используйте плагин WP Crontrol для диагностики.
  • Удаляются не те заказы: Проверьте фильтр даты и статуса. Можно добавить логирование для отладки.
  • Заказы не удаляются полностью: WordPress перемещает записи в корзину, их нужно удалять отдельно, как показано в примере.

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

  • Перед удалением заказов сделайте резервную копию базы данных.
  • Не удаляйте заказы сразу, лучше перемещать их в корзину для возможности восстановления.
  • Запускайте удаление заказов в ночное время, чтобы не нагружать сайт в часы пик.
  • Если заказов много, разбивайте удаление на порции, чтобы избежать таймаутов.
  • Включите логирование удалений для аудита и отладки.

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

МетодПлюсыМинусы
Плагин (например, WP Bulk Delete)Простота настройки, интерфейсЧасто платные, могут конфликтовать с другими плагинами
Кастомный код + WP-CronПолный контроль, гибкость, бесплатноНужны навыки программирования, поддержка
Ручное удаление через админкуБезопасно, визуально понятноТрудоёмко, не подходит для большого количества заказов
Как использовать WooCommerce хуки для дополнительного уведомления о платеже
24.04.2026
Как добавить дополнительные поля в WP REST API для кастомных типов записей
05.02.2026
Автоматическое отключение пингов и пингбэков в WordPress
08.03.2026
Как добавить собственные виджеты в WordPress
24.11.2025
Автоматическое удаление спам-комментариев в WordPress
26.01.2026