wpcontrol.ru wordpress WPControl.ru

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

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

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

Основная задача — настроить автоматическое удаление заказов по заданным статусам и дате создания, чтобы поддерживать базу в оптимальном состоянии.

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

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

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

function wpcontrol_delete_old_orders( $statuses = array('cancelled', 'failed'), $days_ago = 30 ) {
    if ( ! function_exists('wc_get_orders') ) {
        return;
    }

    // Дата - заказы старше $days_ago дней
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days_ago} days" ) );

    $args = array(
        'limit' => -1,
        'status' => $statuses,
        'date_created' => '<' . $date,
        'return' => 'ids',
    );

    $order_ids = wc_get_orders( $args );

    foreach ( $order_ids as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( $order ) {
            $order->delete( true ); // удаляем навсегда
        }
    }
}

Шаг 2. Запускаем функцию по расписанию через WP-Cron

Чтобы функция выполнялась регулярно, например, раз в неделю, зарегистрируем кастомное событие и повесим на него удаление.

add_action( 'wpcontrol_weekly_order_cleanup', 'wpcontrol_delete_old_orders' );

function wpcontrol_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpcontrol_weekly_order_cleanup' ) ) {
        wp_schedule_event( time(), 'weekly', 'wpcontrol_weekly_order_cleanup' );
    }
}
add_action( 'wp', 'wpcontrol_schedule_order_cleanup' );

Шаг 3. Настройка параметров удаления

Вы можете изменить массив $statuses и число дней $days_ago в вызове функции по необходимости. Например, чтобы удалить заказы со статусом 'failed' старше 60 дней:

wpcontrol_delete_old_orders( array('failed'), 60 );

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

1. Подключитесь к базе данных и выполните запрос для подсчёта заказов с нужным статусом и датой до и после запуска крона:

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' 
AND post_status IN ('wc-cancelled', 'wc-failed') 
AND post_date < '2023-01-01 00:00:00';

2. Можно добавить временный лог внутри функции для отладки:

error_log( 'Deleted order ID: ' . $order_id );

3. Для ручного теста вызовите функцию напрямую через admin-ajax или WP-CLI.

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

  • Ничего не удаляется — проверьте, что статус заказа правильно указан с префиксом 'wc-' в базе (например, 'wc-cancelled'). В wc_get_orders можно передавать без 'wc-', но в запросах SQL важно учитывать префикс.
  • Функция не запускается по расписанию — убедитесь, что WP-Cron работает (например, посетите сайт и проверьте логи). Можно использовать системный cron для вызова wp-cron.php.
  • Удаляются не те заказы — проверьте параметры даты и статуса, добавьте отладочный вывод для проверки выборки.
  • Ошибки в базе при удалении — возможно, есть сторонние плагины, которые блокируют удаление. Попробуйте отключить плагины или использовать метод $order->set_status('trash') вместо полного удаления.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Ограничьте количество удаляемых заказов за один запуск, чтобы не перегружать сервер. Например, используйте параметр limit = 100.
  • Внедрите логирование удалённых заказов для отслеживания действий.
  • Если база большая, используйте WP-CLI для запуска скрипта, что ускорит процесс.
  • Не удаляйте заказы с важными статусами, например, 'completed' или 'processing', без подтверждения.

Сравнение вариантов реализации

МетодПлюсыМинусы
Плагин для очистки заказовПростота использования, настройки через UIМогут быть избыточными, нагрузка на сайт, не всегда гибко
Самописный код с WP-Cron (как в статье)Точный контроль, лёгкая настройка, без сторонних зависимостейТребует базовых знаний PHP и WP API, настройка cron
Удаление через SQL-запросы напрямуюБыстро и эффективно для больших базРиск повреждения данных, требует осторожности и резервного копирования
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙