wpcontrol.ru wordpress WPControl.ru

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

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

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

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

Основные критерии отбора заказов

Для удаления необходимо выбрать:

  • Статус заказов (например, 'cancelled', 'refunded')
  • Период давности (например, старше 90 дней)

Это позволит точно контролировать, какие заказы будут удалены.

Пошаговое решение через пользовательский код

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

function wc_auto_delete_old_orders() {
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    global $wpdb;

    $statuses = array( 'cancelled', 'refunded' ); // Статусы для удаления
    $days_old = 90; // Удалять заказы старше 90 дней

    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );

    foreach ( $statuses as $status ) {
        $order_ids = $wpdb->get_col( $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            'wc-' . $status,
            $date_threshold
        ) );

        foreach ( $order_ids as $order_id ) {
            wp_delete_post( $order_id, true ); // Полное удаление
        }
    }
}

// Запускаем раз в сутки через WP Cron
add_action( 'wp_loaded', function() {
    if ( ! wp_next_scheduled( 'wc_auto_delete_old_orders_cron' ) ) {
        wp_schedule_event( time(), 'daily', 'wc_auto_delete_old_orders_cron' );
    }
});

add_action( 'wc_auto_delete_old_orders_cron', 'wc_auto_delete_old_orders' );

Объяснение кода

  • Определяем статусы заказов для удаления и дату порога.
  • Запрашиваем ID заказов с нужными статусами и датой создания старше порога.
  • Удаляем заказы полностью с помощью wp_delete_post с параметром true.
  • Настраиваем cron-задачу для автоматического выполнения ежедневно.

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

Для проверки работоспособности:

  1. Создайте тестовые заказы с нужным статусом и датой старше 90 дней (можно вручную изменить дату в базе или использовать плагин для редактирования заказов).
  2. Запустите cron-задачу вручную через WP-CLI или через вызов функции в админке (например, временно заменить wp_schedule_event на немедленный запуск).
  3. Проверьте, удалились ли соответствующие заказы в админке WooCommerce.
  4. Проверьте таблицы базы данных wp_posts и wp_postmeta на наличие удалённых записей.

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

  • Удаление не происходит: Убедитесь, что cron-задача запущена, и пользователь имеет права manage_woocommerce. Для диагностики можно добавить логирование в функцию.
  • Удаляются не те статусы: Проверьте правильность префикса wc- перед статусом и соответствие статусов с теми, что используются на сайте (wc-pending, wc-completed и т.д.).
  • Заказы не удаляются полностью: Проверьте, что wp_delete_post вызывается с вторым параметром true для полного удаления (без перемещения в корзину).
  • Производительность падает при большом количестве заказов: Добавьте лимит на количество заказов, удаляемых за один проход, например, 50, и запускайте cron чаще.

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

  • Перед внедрением автоматического удаления сделайте резервную копию базы данных.
  • Добавьте логирование удалённых заказов в файл для аудита.
  • Для больших баз предпочтительно использовать пакетную обработку с лимитом и сдвигом (offset) для избежания таймаутов.
  • Используйте WP-CLI для запуска удаления вручную при необходимости.
  • Обязательно проверяйте права пользователя, вызывающего функцию удаления, чтобы избежать несанкционированного удаления.

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

МетодПлюсыМинусыКогда использовать
Код с WP CronАвтоматизация, гибкость, не требует плагиновТребует навыков кодирования, настройка cronДля разработчиков, контроль над процессом
Плагины очистки базы (Clearfy Pro и др.)Простота, интерфейс, дополнительные функции оптимизацииМогут быть платными, меньше гибкостиДля администраторов без навыков программирования
Ручное удаление через админкуПростота, не требует настроекТрудозатратно, риск пропуска заказовМалые магазины, разовые действия
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙