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

Почему важно удалять заказы со статусом Отменен и Возврат

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

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

Чтобы понять, сколько заказов подлежат удалению, выполните следующий SQL-запрос в базе данных WordPress:

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 превышает несколько сотен, стоит настроить автоматическое удаление.

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

1. Создаем функцию удаления заказов

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

function wpmentor_delete_cancelled_refunded_orders() {
    // Получаем ID заказов со статусом отменен и возврат
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-refunded'],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $orders = get_posts($args);
    if (empty($orders)) {
        return;
    }
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true — удалить без возможности восстановления
    }
}

2. Регистрируем событие WP-Cron

Добавьте расписание для ежедневного запуска функции. Вставьте в functions.php или плагин:

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

add_action('wpmentor_daily_order_cleanup', 'wpmentor_delete_cancelled_refunded_orders');

3. Запуск и проверка

Чтобы проверить работу вручную, вызовите функцию напрямую через админку, например, добавив временный вызов:

add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['run_order_cleanup'])) {
        wpmentor_delete_cancelled_refunded_orders();
        wp_redirect(admin_url());
        exit;
    }
});

Зайдите в админку по адресу https://ваш_сайт/wp-admin/?run_order_cleanup=1. После выполнения проверьте, что заказы удалены.

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

  • Выполните SQL-запрос из раздела диагностики — количество заказов с указанными статусами должно стремиться к нулю.
  • Проверьте админку WooCommerce → Заказы — отменённые и возвращённые заказы должны исчезать.
  • Убедитесь, что автоматическое событие WP-Cron запускается ежедневно (можно использовать плагин WP Crontrol для мониторинга).

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

  • Заказы не удаляются автоматически: проверьте, работает ли WP-Cron на вашем хостинге. На некоторых серверах WP-Cron отключён — настройте системный CRON или используйте плагин WP Crontrol.
  • Удаление не происходит из-за прав доступа: убедитесь, что функция вызывается с необходимыми правами и что пользователь имеет права на удаление заказов.
  • Удаление заказов вызывает ошибки: проверьте, что все зависимости WooCommerce загружены и функция не вызывается слишком рано (например, при инициализации плагинов).
  • Удаляются нужные заказы: проверьте фильтр по статусам wc-cancelled и wc-refunded — не меняйте без необходимости.

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

  • Используйте wp_delete_post($order_id, true) с параметром true, чтобы удалять заказы без помещения в корзину и не засорять базу.
  • Если заказов слишком много, делайте удаление пакетами, чтобы не перегружать сервер. Например, по 50 заказов за раз.
  • Отключайте автоматическое удаление на время важных операций с базой или во время пиковых нагрузок.
  • Резервное копирование базы перед внедрением этой функции обязательно.

Таблица сравнения вариантов удаления заказов

МетодПлюсыМинусыРекомендации
Ручное удаление через админкуПростота, контрольТрудоемко при большом объемеПодходит для небольших магазинов
WP-Cron автоматизация с кастомным кодомАвтоматизация, гибкостьЗависит от работы WP-Cron, требует настройкиОптимально для средних и больших магазинов
Плагины для очистки базыБыстрое внедрение, UIМогут быть избыточными, нагрузкиИспользовать с осторожностью, тестировать
Как добавить динамические атрибуты в shortcode WordPress
01.03.2026
Как использовать хуки в WordPress: практическое руководство
10.11.2025
Как создать и настроить свое виджет в WordPress
22.11.2025
WooCommerce: решение проблемы неработающей функции изменения стоимости товара при добавлении в корзину
22.04.2026
Как удалить и заблокировать регистрацию пользователей в WordPress
23.01.2026