Автоматическое удаление возвращённых и отменённых заказов WooCommerce

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

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

Если не чистить эти заказы регулярно, таблица wp_posts и связанные с ней wp_postmeta будут содержать тысячи записей, которые не нужны для текущей работы магазина.

Как понять, что проблема есть:

  • Медленная работа панели заказов в WooCommerce
  • Большой размер таблицы wp_posts (миллионы записей)
  • Отчёты WooCommerce показывают много заказов с статусом "refunded" и "cancelled", которые вы не планируете анализировать

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

Используем WP Cron для периодического запуска кода, который удалит заказы с нужными статусами старше определённого срока.

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

function wpguest_delete_old_cancelled_refunded_orders() {
    // Установим лимит по дате, например, удалять заказы старше 30 дней
    $date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-refunded'),
        'date_query'     => array(
            array(
                'before' => $date_limit,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => 100, // ограничение на партию
        'fields'         => 'ids',
    );

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // true — без перемещения в корзину
        }
    }
}

2. Регистрация задачи в WP Cron

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

add_action('wpguest_daily_order_cleanup', 'wpguest_delete_old_cancelled_refunded_orders');

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

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

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

  • Подключитесь к базе данных через phpMyAdmin или через админку хостинга, проверьте количество заказов с post_status "wc-cancelled" и "wc-refunded" до и после запуска cron.
  • В WooCommerce > Заказы убедитесь, что старые отменённые и возвращённые заказы исчезли.
  • В админке WordPress выполните вручную функцию через вызов в плагине Code Snippets или временно добавьте вызов wpguest_delete_old_cancelled_refunded_orders(); в functions.php, чтобы проверить удаление сразу.

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

  • Заказы не удаляются: Проверьте, что WP Cron работает на сайте. Для этого можно использовать плагин WP Crontrol. Если WP Cron отключён, задача не запустится.
  • Удаляются не те заказы: Убедитесь, что в массиве post_status стоят правильные статусы с префиксом wc-. Например, "cancelled" — это "wc-cancelled".
  • Превышение лимита по памяти или времени выполнения: уменьшите параметр posts_per_page или используйте пакетную обработку с временными паузами.
  • Удаление заказов приводит к потере данных: Сделайте резервную копию базы перед запуском кода.

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

  • Запускайте удаление не чаще раза в сутки, чтобы не нагружать сервер.
  • Добавьте логирование удалённых заказов в отдельный файл для аудита, например:
function wpguest_log_deleted_order($order_id) {
    error_log('Deleted order ID: ' . $order_id);
}

Вызовите wpguest_log_deleted_order($order_id); внутри цикла удаления.

  • Для больших магазинов с миллионами заказов рекомендуем делать удаление пакетами с лимитом и запускать задачу несколько раз с интервалом.
  • Ограничьте права пользователя, который добавляет этот код, чтобы избежать случайного удаления.

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

МетодПреимуществаНедостатки
Удаление через WP Cron и кодАвтоматизация, точечное удаление по статусу и дате, гибкостьНужно контролировать работу WP Cron, требует базовых навыков PHP
Удаление вручную через админкуПростота, не требует кодаТрудоёмко при большом объёме заказов, риск пропуска
Плагины очистки WooCommerceУдобство, готовые решения, дополнительные функции (оптимизация)Нагрузка на сайт, возможные конфликты, лицензии
Как автоматизировать удаление старого контента WooCommerce по дате
13.06.2026
Как автоматизировать изменение статусов заказов WooCommerce с помощью кода
03.06.2026
Как автоматизировать удаление отзывов с пустым содержанием в WooCommerce
09.07.2026
Как автоматизировать удаление неиспользуемых пользователей в WordPress
01.04.2026
Автоматическое удаление старых товаров WooCommerce по дате
17.06.2026