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

Проблема: Зачем автоматизировать удаление отменённых и возвращённых заказов в WooCommerce

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

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

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

SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-refunded') GROUP BY post_status;

Если количество заказов с статусами wc-cancelled и wc-refunded растёт и занимает существенную часть базы, стоит автоматизировать очистку.

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

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

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

function wpguest_delete_old_cancelled_refunded_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-refunded'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '30 days ago', // Удалять заказы старше 30 дней
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );
    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true — полное удаление
        }
    }
}

2. Автоматизируем запуск функции через WP-Cron

Добавьте планировщик, который будет запускать очистку раз в сутки:

if (!wp_next_scheduled('wpguest_daily_cleanup_cancelled_refunded')) {
    wp_schedule_event(time(), 'daily', 'wpguest_daily_cleanup_cancelled_refunded');
}
add_action('wpguest_daily_cleanup_cancelled_refunded', 'wpguest_delete_old_cancelled_refunded_orders');

3. Опционально: добавьте очистку транзиентов и кеша после удаления

Если используете кеш или транзиенты, очистите их, чтобы обновить данные:

function wpguest_cleanup_cache_after_order_delete() {
    // Пример для очистки транзиентов WooCommerce
    global $wpdb;
    $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_wc_%'");
}
add_action('wpguest_daily_cleanup_cancelled_refunded', 'wpguest_cleanup_cache_after_order_delete');

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

  • После первого запуска крона проверьте наличие заказов с отменённым и возвращённым статусом старше 30 дней в админке WooCommerce.
  • Запустите вручную функцию для проверки без ожидания cron, вызвав wpguest_delete_old_cancelled_refunded_orders() через WP-CLI:
wp eval 'wpguest_delete_old_cancelled_refunded_orders();'
  • Проверьте таблицу wp_posts на предмет удалённых записей.
  • Убедитесь, что в базе уменьшилось количество заказов с указанными статусами.

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

  • Функция не запускается регулярно: Проверьте, работает ли WP-Cron на вашем хостинге. В некоторых случаях нужны внешние cron-задачи.
  • Заказы не удаляются: Убедитесь, что статусы заказов указаны правильно с префиксом wc-, и что дата post_date соответствует дате создания заказа.
  • Удаляются не те заказы: Проверьте аргументы date_query и post_status в запросе get_posts.
  • Удаление затягивается или вызывает нагрузку: разбейте удаление на части, ограничив posts_per_page до 100 и добавьте промежутки между пакетами.

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

  • Запускайте удаление в периоды низкой нагрузки, чтобы не замедлять сайт.
  • Создавайте резервную копию базы перед внедрением автоматического удаления.
  • Используйте wp_delete_post($order_id, true) для полного удаления, включая метаданные и связи.
  • Если на сайте много заказов, рассмотрите использование WP-CLI для пакетной очистки.
  • Проверяйте логи ошибок PHP и сервера на предмет проблем с памятью или таймаутов.

Сравнение способов удаления отменённых и возвращённых заказов

МетодПлюсыМинусы
Ручное удаление через админку WooCommerceПростой, не требует кодаНевозможно массово удалить старые заказы, трудозатратно
Автоматизация через WP-Cron и get_posts + wp_delete_postАвтоматически очищает базу, гибкость настроекЗависит от корректной работы WP-Cron, требует тестирования
Использование плагинов очистки базы данныхПростота установки, дополнительные функции оптимизацииМожет не иметь точных настроек под заказы WooCommerce
Как создать собственный плагин WordPress с настройками
10.11.2025
Оптимизация базы данных WordPress для ускорения сайта
17.11.2025
Как автоматизировать создание собственных типов записей в WordPress с помощью кода и плагинов
21.12.2025
Как автоматизировать удаление неиспользуемых transient в WordPress
16.04.2026
Использование хука WooCommerce 'woocommerce_order_status_changed' для автоматизации обновлений
23.06.2026