WooCommerce: как автоматически удалять отменённые заказы без ошибок

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

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

Проблема осложняется тем, что при удалении заказов, связанных с другими данными (например, платежами, сессиями), можно получить ошибки или потерять целостность данных.

Пошаговое решение: автоматическое удаление отменённых заказов через wp-cron

1. Создание функции для удаления заказов со статусом "cancelled" или "refunded"

WooCommerce хранит заказы как записи типа shop_order с разными статусами. Для удаления нужно использовать стандартные функции WordPress и WooCommerce, чтобы не нарушить связи и избежать ошибок.

function wpconfig_delete_cancelled_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-refunded'],
        'posts_per_page' => 50, // ограничение на партию для нагрузки
        'fields'         => 'ids',
    ];

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // безопасное удаление через корзину
        }
    }
}

2. Планирование регулярного запуска через wp-cron

Добавим хук, который будет запускать функцию, например, один раз в день.

add_action('wpconfig_daily_delete_cancelled_orders', 'wpconfig_delete_cancelled_orders');

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

3. Очистка удалённых заказов из корзины (Trash)

После перемещения в корзину заказы ещё занимают место. Можно автоматически очищать корзину заказов старше 7 дней.

function wpconfig_empty_order_trash() {
    global $wpdb;
    $interval = 7 * DAY_IN_SECONDS;
    $date_threshold = date('Y-m-d H:i:s', time() - $interval);

    $orders_in_trash = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} 
             WHERE post_type = 'shop_order' 
             AND post_status = 'trash' 
             AND post_modified < %s",
            $date_threshold
        )
    );

    if (!empty($orders_in_trash)) {
        foreach ($orders_in_trash as $order_id) {
            wp_delete_post($order_id, true); // окончательное удаление
        }
    }
}
add_action('wpconfig_daily_delete_cancelled_orders', 'wpconfig_empty_order_trash');

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

  • Проверьте наличие отменённых заказов в админке WooCommerce → Заказы → фильтр "Отменённые". После запуска скрипта их количество должно уменьшаться.
  • В базе данных (через phpMyAdmin) можно выполнить запрос:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-refunded');
    Число записей должно уменьшаться после запуска функции.
  • Просмотрите логи ошибок сервера и WordPress, чтобы убедиться, что не возникает сбоев при запуске cron-задачи.

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

  • Заказы не удаляются: Проверьте, активна ли wp-cron. В некоторых настройках сервера wp-cron отключён. Запустите cron вручную через WP CLI:
    wp cron event run wpconfig_daily_delete_cancelled_orders
  • Удаляются не все заказы: Ограничение posts_per_page в 50 заказов — это защитная мера. Если много заказов, функция будет вызываться ежедневно, постепенно очищая базу.
  • Ошибки при удалении: Убедитесь, что нет конфликтующих плагинов, которые блокируют удаление заказов или меняют их статусы.
  • Заказы остаются в корзине: Проверьте, что функция очистки корзины подключена к тому же событию cron.

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

  • Не используйте wp_delete_post($order_id, true) напрямую без логики, чтобы избежать случайного удаления важных данных. Используйте сначала wp_trash_post() для безопасного перемещения в корзину.
  • Ограничивайте количество удаляемых заказов за один запуск, чтобы избежать тайм-аутов или перегрузки сервера.
  • Регулярно проверяйте статус wp-cron и при необходимости настраивайте системный cron для вызова wp-cron.php.
  • Перед внедрением на живом сайте протестируйте функцию на копии сайта или в тестовом окружении.
  • Для магазинов с большим объёмом заказов можно реализовать удаление с пагинацией и логированием, чтобы отслеживать прогресс.

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

МетодПлюсыМинусы
Ручное удаление через админкуПростота, контрольТрудоёмко, риск ошибок
Плагины очистки WooCommerceАвтоматизация, удобствоМогут быть платными, конфликты с другими плагинами
Код через wp-cron (описанный способ)Гибкость, контроль, бесплатноНужно базовое знание кода, настройка wp-cron
Как изменить и добавить новые поля в регистрации WordPress: практическое руководство
17.11.2025
Как установить и настроить WPConfig Logger для логирования ошибок в WordPress
27.02.2026
Как создать собственный REST API endpoint в WordPress: подробное руководство
08.11.2025
Как автоматизировать удаление старого контента в WordPress: практические советы и примеры кода
18.02.2026
Как разрешить доступ к wp-admin по IP с помощью .htaccess
30.04.2026
×
WPShop
партнерка без «но»!

До 3225₽ за каждую продажу

Подключиться к игре