wpcontrol.ru wordpress WPControl.ru

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

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

По умолчанию WooCommerce не удаляет отменённые заказы автоматически. Они остаются в базе данных, занимая место и усложняя анализ статистики. Если на сайте много отменённых заказов, это может привести к замедлению работы административной панели и увеличению нагрузки на сервер.

Чтобы проверить, сколько отменённых заказов у вас хранится, можно выполнить SQL-запрос через phpMyAdmin или WP-CLI:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

Если число высоко и растёт, пора автоматизировать очистку.

Пошаговое решение: автоматическое удаление отменённых заказов по расписанию

Добавляем планировщик задач WordPress (WP-Cron)

Создаём функцию, которая будет искать и удалять отменённые заказы старше определённого срока, например 30 дней.

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

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $orders = get_posts($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - принудительное удаление без перемещения в корзину
    }
}

Регистрируем событие в WP-Cron

Добавим задачу, которая будет запускаться раз в сутки.

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

add_action('wc_daily_cancelled_orders_cleanup', 'wc_delete_old_cancelled_orders');

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

Для проверки того, что скрипт работает:

  • В админке WooCommerce перейдите в «Заказы» и отфильтруйте их по статусу «Отменён».
  • Запомните количество заказов старше 30 дней.
  • Запустите вручную функцию wc_delete_old_cancelled_orders() через выполнение PHP-кода (например, через плагин Code Snippets или WP-CLI).
  • Обновите страницу заказов: старые отменённые заказы должны исчезнуть.
  • Через 24 часа проверьте логи и количество заказов — они должны уменьшаться автоматически.

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

  • Функция не запускается по расписанию: убедитесь, что WP-Cron активен и на сайте есть посещения, которые его запускают. Для проверки используйте плагин WP Crontrol.
  • Удаление не происходит: проверьте права пользователя, от имени которого выполняется скрипт. Использование wp_delete_post($order_id, true) требует прав администратора.
  • Удаляются не те заказы: внимательно проверьте параметр post_status и дату. Возможно, статус отличается (например, используется кастомный статус).

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

  • Не удаляйте заказы моложе 30 дней — это позволит избежать удаления недавно отменённых покупок, которые могут понадобиться для аналитики или возвратов.
  • Для больших баз данных используйте WP-CLI вместо WP-Cron — это снизит нагрузку на сайт и позволит запускать задачу в удобное время.
  • Резервируйте базу данных перед внедрением автоматического удаления.
  • Отслеживайте логи ошибок PHP и WooCommerce, чтобы вовремя заметить сбои.

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

МетодПлюсыМинусыПример использования
Ручное удаление в админкеПросто и без кодаТрудозатратно при большом количестве заказовЧерез интерфейс WooCommerce
WP-Cron с кастомной функциейАвтоматизация, гибкостьЗависит от посещаемости сайта, нагрузка при большом объёмеКод из статьи
WP-CLI скриптВысокая производительность, подходит для больших сайтовТребует доступа к серверу и навыков работы с консольюwp wc order delete --status=cancelled --before=30d
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙