wpcontrol.ru wordpress WPControl.ru

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

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

В стандартном WooCommerce заказы с разными статусами хранятся в базе данных до тех пор, пока администратор не удалит их вручную. Однако с ростом объема заказов это ведет к раздуванию базы и замедлению работы сайта, особенно в отчетах и поиске. Часто необходимо автоматически очищать заказы со статусом cancelled, failed или refunded, которые старше определенного срока (например, 30 или 60 дней).

Решение вручную — утомительный и рискованный процесс. Автоматизация с помощью WP-Cron и кастомного кода решает эту задачу без потери данных по актуальным заказам.

Шаги для автоматического удаления заказов по статусу и дате

1. Создайте функцию для выборки и удаления заказов

Функция должна искать заказы с нужными статусами и датой создания старше определенного периода, затем удалять их программно.

function wpcontrol_delete_old_orders() {
    $statuses_to_delete = array('cancelled', 'failed', 'refunded');
    $days_old = 60; // количество дней
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days"))
    );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses_to_delete,
        'date_query'     => array($date_query),
        'posts_per_page' => 100, // лимит на удаление за один запуск
        'fields'         => 'ids'
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // true - удаление без корзины
        }
    }
}

2. Добавьте WP-Cron для регулярного запуска

Чтобы функция запускалась автоматически, создайте событие WP-Cron. Добавьте следующий код в файл functions.php вашей темы или в плагин:

if (!wp_next_scheduled('wpcontrol_daily_order_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpcontrol_daily_order_cleanup');
}

add_action('wpcontrol_daily_order_cleanup', 'wpcontrol_delete_old_orders');

3. Остановите событие при деактивации плагина или темы

Для чистоты кода и предотвращения лишних вызовов удалите крон-событие при отключении:

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

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

  • Выполните функцию вручную (например, вызвав wpcontrol_delete_old_orders() из консоли WP-CLI или временно добавив вызов в functions.php) и проверьте удаление старых заказов.
  • Проверьте наличие запланированного события wpcontrol_daily_order_cleanup с помощью плагина WP Crontrol или WP-CLI (wp cron event list).
  • Через сутки убедитесь, что заказы с нужным статусом и старше указанного срока удаляются автоматически.

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

  • Неправильный статус заказа: В WooCommerce статусы заказов могут иметь префикс wc- в базе данных. В WP_Query для post_status нужно писать только статус без wc-, например cancelled, failed. Если не работает — попробуйте указать полный вид wc-cancelled.
  • Отсутствие cron-события: Если функция не запускается автоматически, убедитесь, что WP-Cron включен (опция DISABLE_WP_CRON не равна true).
  • Удаление не происходит: Проверьте права пользователя и возможность удаления заказов. Также убедитесь, что wp_delete_post вызывается с параметром true для полного удаления без корзины.
  • Производительность при большом количестве заказов: Ограничьте количество заказов на один запуск (posts_per_page) и используйте пакетную обработку, чтобы не перегружать сервер.

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

  • Для предотвращения случайного удаления добавьте проверку nonce или ограничивайте выполнение функции только с правами администратора при ручном вызове.
  • Логируйте удаленные ID заказов в отдельный файл или таблицу для аудита.
  • Если сайт большой, рассмотрите запуск удаления через WP-CLI скрипты или внешние cron-задачи для надежности.
  • Периодически проверяйте таблицы базы данных на наличие поврежденных записей после массового удаления.

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

МетодПлюсыМинусы
Плагин (например, WooCommerce Order Cleanup)Простота настройки, интерфейсМожет не покрывать все сценарии, нагрузка
Кастомный код + WP-CronТочная настройка под задачу, минимальная нагрузкаНужны навыки программирования
Внешний cron + WP-CLIМаксимальная надежность и производительностьТребует доступа к серверу и навыков
×
WordPress
дай сайту суперсилу!

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

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