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

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

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

Основная задача — настроить автоматическое удаление заказов по заданному статусу (например, cancelled, failed) и по времени, прошедшему с даты создания заказа.

Пошаговое решение: реализация автоматического удаления заказов через WP-Cron

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

Пример кода, который удалит все заказы со статусом cancelled старше 30 дней:

function wpfind_delete_old_cancelled_orders() {
    $days = 30; // Количество дней, старше которых заказы будут удалены
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'limit'        => -1, // без ограничения
        'status'       => 'cancelled',
        'date_created' => '<' . $date,
        'return'       => 'ids',
    ];

    $orders = wc_get_orders($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление
        }
    }
}

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

Чтобы запускать функцию ежедневно, используем хук WP-Cron:

function wpfind_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpfind_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpfind_daily_order_cleanup');
    }
}
add_action('wp', 'wpfind_schedule_order_cleanup');
add_action('wpfind_daily_order_cleanup', 'wpfind_delete_old_cancelled_orders');

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

Если код добавлен в плагин или functions.php темы, стоит очищать событие при деактивации:

function wpfind_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wpfind_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpfind_daily_order_cleanup');
    }
}
register_deactivation_hook(__FILE__, 'wpfind_clear_order_cleanup_schedule');

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

  • Проверьте, что задача добавилась в WP-Cron: для этого можно использовать плагин WP Crontrol, чтобы увидеть запланированные события.
  • Создайте тестовые заказы со статусом cancelled и датой старше 30 дней (можно вручную изменить дату через базу или плагин).
  • Запустите задачу вручную через WP Crontrol или вызвав функцию wpfind_delete_old_cancelled_orders() напрямую.
  • Проверьте, что заказы удалились из админки WooCommerce и базы данных (таблица wp_posts с post_type = 'shop_order').

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

  • Заказы не удаляются: проверьте, что статусы заказов указаны корректно (например, cancelled, failed, pending). Используйте wc_get_order_statuses() для списка доступных статусов.
  • Удаление не происходит из-за кэширования: если сайт использует агрессивное кэширование, запускайте задачу вручную или отключите кэш на время тестирования.
  • WP-Cron не работает: на некоторых хостингах WP-Cron требует внешних запросов. Проверьте, срабатывает ли cron, или настройте системный cron для вызова wp-cron.php.
  • Ошибка прав доступа: функция wp_delete_post() требует прав администратора. Убедитесь, что код выполняется с необходимыми правами (например, в контексте cron-задания).

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

  • Удаление заказов — необратимая операция. Рекомендуется создавать резервные копии базы перед внедрением.
  • Для очень больших магазинов с тысячами заказов разбейте удаление на партии, чтобы избежать превышения лимитов по времени выполнения скрипта. Например, ограничьте количество удаляемых заказов в одном запуске:
function wpfind_delete_old_cancelled_orders_batch() {
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'limit'        => 50, // удаляем по 50 за раз
        'status'       => 'cancelled',
        'date_created' => '<' . $date,
        'return'       => 'ids',
    ];

    $orders = wc_get_orders($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
        }
    }
}
  • Регулярно проверяйте логи ошибок PHP и WooCommerce, чтобы отследить возможные сбои удаления.
  • Если хотите расширить функционал — можно добавить опцию в админку для выбора статусов и срока удаления, используя Settings API.

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

МетодПлюсыМинусыКогда использовать
Код с WP-CronГибкий, бесплатно, полностью под контролемТребует навыков программирования, нужно следить за cronПодходит для разработчиков и средних магазинов
Плагины очистки заказов (например, WooCommerce Order Cleaner)Простые настройки, интерфейсМогут быть платными, менее гибкиеДля владельцев без навыков программирования
Ручное удаление через админкуПросто, без кодаТрудоёмко, неэффективно при большом количестве заказовДля единичных случаев
Как удалить или отключить XML-RPC в WordPress для повышения безопасности
30.03.2026
Как удалить все комментарии от определённого автора в WordPress
23.11.2025
Как использовать WP REST API для создания пользовательских endpoint’ов в WordPress
02.04.2026
Как избежать конфликтов между темами и плагинами WordPress
06.03.2026
Как использовать WooCommerce REST API для автоматизации заказов в WordPress
09.03.2026

Сайт в разработке, скоро здесь будет портал о WordPress.