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

Диагностика проблемы с неактивными заказами в WooCommerce

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

Чтобы выявить проблему, проверьте количество заказов в таких статусах и дату их создания:

SELECT post_status, COUNT(*) AS count, MIN(post_date) AS oldest_order 
FROM wp_posts 
WHERE post_type = 'shop_order' 
GROUP BY post_status;

Результат покажет, сколько заказов и с какой самой старой датой находятся в каждом статусе. Если вы видите большое количество заказов в статусах вроде wc-pending или wc-cancelled старше нескольких месяцев — пора автоматизировать их удаление.

Пошаговое решение: удаление заказов по срокам с помощью WP-Cron

1. Создание функции удаления заказов

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

function wps_remove_old_woocommerce_orders() {
    $statuses_to_delete = array('wc-pending', 'wc-cancelled'); // Статусы для удаления
    $days_old = 30; // Удалять заказы старше 30 дней

    $date_threshold = 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(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $old_orders = get_posts($args);

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // Удаляем без перемещения в корзину
        }
    }
}

2. Регистрация WP-Cron задачи для регулярного запуска

Чтобы функция запускалась автоматически, добавим задачу в WP-Cron. Например, запускать раз в сутки.

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

add_action('wps_daily_old_orders_cleanup', 'wps_remove_old_woocommerce_orders');

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

Чтобы проверить, что удаление работает корректно:

  • Создайте тестовые заказы в статусах pending и cancelled с датами старше 30 дней (можно через SQL или программно).
  • Запустите функцию вручную из консоли WP-CLI или через временный вызов в functions.php:
wps_remove_old_woocommerce_orders();
  • Проверьте, что заказы удалились из базы (в админке или через SQL).
  • Проверьте логи ошибок и производительность сайта — не должно быть сбоев.

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

  • Заказы не удаляются: Проверьте, что статусы указаны с префиксом wc- (например, wc-pending), а не просто pending.
  • Функция не запускается по расписанию: Убедитесь, что WP-Cron работает (не отключен) и есть посещения сайта для его срабатывания, либо используйте реальный cron на сервере.
  • Удаление приводит к ошибкам: Возможно, другие плагины или кастомный код блокируют удаление заказов. Проверьте права пользователя и используйте wp_delete_post($order_id, true) для принудительного удаления.
  • Удаление не учитывает нужные статусы: Проверьте через print_r(wc_get_order_statuses()) все возможные статусы и выберите подходящие.

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

  • Всегда делайте резервные копии базы данных перед внедрением автоматического удаления.
  • Ограничивайте выборку заказов по дате и статусу, чтобы избежать долгих запросов и нагрузки.
  • Для больших магазинов используйте пакетную обработку (например, удалять по 100 заказов за раз).
  • Проверяйте права пользователя, под которым запускается код — лучше использовать роль администратора.
  • Если магазин использует сторонние сервисы для учёта заказов, синхронизируйте удаление с ними, чтобы не потерять важные данные.

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

МетодПлюсыМинусыТребования
Код на WP-Cron (как в статье)Гибкость, без плагинов, точечное управлениеЗависит от посещаемости сайта, требует навыков PHPДоступ к файлам сайта, базовые знания PHP
Плагины очистки заказов (например, WP Bulk Delete)Простота настройки, графический интерфейсМогут быть лишние функции, нагрузка на БД при больших объемахУстановка плагина, возможно платные функции
Ручное удаление через админку WooCommerceПростота, не требует кодаТрудозатратно, риск пропусковВремя и внимание администратора
Автоматическое создание копий постов в WordPress
26.12.2025
WooCommerce: автоматическое обновление статуса заказов по условиям
11.07.2026
Как отключить cart fragments в WooCommerce и не сломать обновление корзины
09.08.2026
Как автоматизировать присоединение пользователей к группе в WordPress
03.01.2026
Как использовать Custom Post Types в WordPress для создания нестираемых структур
04.04.2026