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

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

Магазины на WooCommerce со временем накапливают большое количество отменённых заказов (статус cancelled) и прочих неактивных записей. Это приводит к увеличению размера базы данных, замедлению запросов и ухудшению производительности сайта, особенно на больших магазинах. Регулярная очистка таких данных помогает поддерживать скорость и уменьшать нагрузку на сервер.

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

Использование WP-Cron для удаления заказов со статусом cancelled

WooCommerce по умолчанию не удаляет отменённые заказы, только меняет им статус. Чтобы автоматизировать очистку, можно создать собственный WP-Cron, который будет регулярно запускать функцию удаления таких заказов.

function wp0_delete_cancelled_orders() {
    $args = array(
        'status' => 'cancelled',
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление без корзины
    }
}

// Регистрируем событие при активации темы или плагина
function wp0_schedule_cancelled_orders_cleanup() {
    if (!wp_next_scheduled('wp0_cleanup_cancelled_orders_event')) {
        wp_schedule_event(time(), 'daily', 'wp0_cleanup_cancelled_orders_event');
    }
}
add_action('wp', 'wp0_schedule_cancelled_orders_cleanup');

// Обработчик события
add_action('wp0_cleanup_cancelled_orders_event', 'wp0_delete_cancelled_orders');

// Очистка расписания при деактивации (например, темы или плагина)
function wp0_clear_cancelled_orders_cleanup() {
    $timestamp = wp_next_scheduled('wp0_cleanup_cancelled_orders_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wp0_cleanup_cancelled_orders_event');
    }
}

Настройка частоты выполнения

Можно заменить 'daily' на 'twicedaily', если хотите запускать очистку два раза в день. Для кастомных интервалов добавьте фильтр cron_schedules.

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

  • Перейдите в админку WooCommerce > Заказы и отфильтруйте по статусу «Отменён» — список должен очищаться после запуска WP-Cron (обычно в течение суток).
  • Проверьте таблицу wp_posts в базе данных для типа shop_order со статусом cancelled — записи должны исчезать.
  • Для ручного теста можно вызвать функцию напрямую через wp shell или временно добавить вызов в functions.php.

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

  • Заказы не удаляются: Убедитесь, что WP-Cron работает на сервере. На локальных или некоторых хостингах WP-Cron может не запускаться автоматически. Проверьте работу с помощью плагина WP Crontrol или вызовите функцию вручную.
  • Удаляются не все заказы: Проверьте, что в запросе wc_get_orders правильно указан статус cancelled и нет ограничений по времени или лимиту.
  • Ошибки прав доступа: Функция wp_delete_post с параметром true требует права на удаление. Запускайте код с достаточными правами (обычно через hooks в админке).

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

  • Не удаляйте заказы сразу после статуса cancelled. Рекомендуется сохранять их хотя бы несколько дней для анализа.
  • Добавьте проверку даты создания заказа, чтобы удалять только старые отменённые записи. Например:
function wp0_delete_old_cancelled_orders() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-7 days'));
    $args = array(
        'status' => 'cancelled',
        'limit' => -1,
        'return' => 'ids',
        'date_created' => '<' . $date_threshold,
    );
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}
  • Используйте плагин Clearfy Pro для дополнительной оптимизации базы и удаления мусора из WooCommerce без лишних рисков.
  • Ограничьте частоту очистки — слишком частые вызовы могут нагрузить сервер.

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

МетодПлюсыМинусыПример
WP-Cron + кастомный код Гибкость, полный контроль, бесплатно Зависит от работы WP-Cron, требует технических навыков Код из статьи
Плагины очистки (Clearfy, WP-Optimize) Простота использования, дополнительные функции оптимизации Могут быть платными, не всегда гибкие Clearfy Pro
Ручное удаление через базу данных Быстро, без нагрузки на сайт Опасно, легко повредить данные, требует резервного копирования DELETE запросы в SQL

Наш каталог плагинов WordPress