WooCommerce: автоматическое удаление отменённых и отложенных заказов

Проблема: накопление отменённых и отложенных заказов в WooCommerce

Магазины на WooCommerce часто сталкиваются с тем, что в базе данных накапливается большое количество заказов со статусами cancelled и on-hold. Это не только замедляет работу сайта, но и усложняет аналитику. Автоматическое удаление таких заказов по определённому критерию (например, по времени) поможет поддерживать базу в порядке.

Диагностика проблемы

Для начала убедитесь, что в базе действительно много заказов с нужными статусами. Для этого выполните SQL-запрос через phpMyAdmin или wp-cli:

SELECT post_status, COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Если количество заказов со статусами wc-cancelled или wc-on-hold значительно, стоит автоматизировать их удаление.

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

Реализуем функцию, которую можно запустить через WP-Cron для регулярного удаления заказов старше X дней со статусом cancelled или on-hold.

1. Функция удаления заказов

function wps_delete_old_orders() {
    $statuses = array('wc-cancelled', 'wc-on-hold');
    $days_ago = 30; // Удалять заказы старше 30 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_ago} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - удаление без перемещения в корзину
    }
}

2. Добавление задачи в WP-Cron

Добавим ежедневный крон-запуск функции:

if (!wp_next_scheduled('wps_daily_delete_old_orders')) {
    wp_schedule_event(time(), 'daily', 'wps_daily_delete_old_orders');
}
add_action('wps_daily_delete_old_orders', 'wps_delete_old_orders');

3. Очистка при деактивации плагина или темы

function wps_deactivate_cleanup() {
    wp_clear_scheduled_hook('wps_daily_delete_old_orders');
}
register_deactivation_hook(__FILE__, 'wps_deactivate_cleanup');

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

  • Запустите функцию вручную, чтобы проверить корректность удаления:
wps_delete_old_orders();
  • Проверьте в админке WooCommerce количество заказов со статусами Отменён и Ожидает оплаты.
  • Повторно выполните SQL-запрос из раздела диагностики, чтобы убедиться, что количество заказов уменьшилось.
  • Проверьте журнал ошибок сервера на предмет ошибок во время удаления.

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

  • Заказы не удаляются: проверьте, что в базе статусы заказов начинаются с wc-. WooCommerce добавляет префикс wc- к статусам. В запросах обязательно указывайте полный статус, например, wc-cancelled.
  • Функция не выполняется по расписанию: убедитесь, что WP-Cron работает. Для проверки вызовите wp-cron.php вручную через браузер или curl.
  • Удаление заказов приводит к потере важных данных: проверьте, что политика удаления соответствует требованиям бухгалтерии и хранения данных.
  • Проблемы с производительностью при большом количестве заказов: разбейте удаление на порции с помощью параметра 'posts_per_page' => 50 и запускайте функцию несколько раз.

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

  • Всегда делайте резервные копии базы перед запуском массового удаления.
  • Используйте транзакции или проверяйте успешность удаления при работе с большим объёмом данных.
  • Для крупных магазинов лучше запускать удаление в ночное время, чтобы не нагружать базу в часы пик.
  • Используйте wp_suspend_cache_invalidation(true) в начале функции и wp_suspend_cache_invalidation(false) в конце для оптимизации кэширования.

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

МетодОписаниеПлюсыМинусы
Ручное удаление из админкиУдаление заказов по одному в WooCommerceПросто, не требует кодаТрудоёмко при большом количестве заказов
SQL-запросУдаление заказов напрямую через базу данныхБыстро и эффективноРиск нарушения целостности данных, требует опыта
Автоматизация через WP-Cron с PHPРегулярное удаление через функцию и крон-задачуАвтоматично, безопасно, гибкоТребует написания и тестирования кода
Как создать автоматические уведомления о обновлениях в WordPress
03.01.2026
Как использовать WooCommerce хуки для настройки страницы товара
17.04.2026
WooCommerce: как автоматически удалять заказы по статусу и дате
04.05.2026
WooCommerce: как избежать конфликтов между платёжными шлюзами и кассовыми системами
10.07.2026
Как удалить или исправить файл robots.txt в WordPress
04.12.2025