wpload.ru wordpress WPLoad.ru

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

Почему важно удалять отменённые и просроченные заказы в WooCommerce

Большое количество отменённых и просроченных заказов в базе данных WooCommerce может замедлять работу сайта и создавать беспорядок в админке. Кроме того, такие заказы мешают точной аналитике продаж и усложняют резервное копирование. Автоматическое удаление таких заказов экономит время и ресурсы без потери важных данных.

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

Для начала нужно проверить, есть ли в базе большое количество заказов со статусами cancelled (отменён) и failed (неуспешный). Это можно сделать через SQL-запрос к таблице wp_posts:

SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed') GROUP BY post_status;

Если результаты показывают сотни или тысячи таких заказов, стоит настроить регулярное удаление. Также проверьте дату создания заказов, чтобы не удалить свежие, которые могут ещё измениться.

Пошаговое решение: настройка удаления через WP-Cron

Оптимальный способ — создать функцию, которая будет регулярно удалять заказы старше определённого срока (например, 30 дней) со статусом wc-cancelled или wc-failed. Для этого добавим код в файл functions.php вашей темы или в кастомный плагин.

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

function wpload_delete_old_cancelled_failed_orders() {
    $days = 30; // срок в днях
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
        'no_found_rows'  => true,
        'cache_results'  => false,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true — без возможности восстановления
        }
    }
}

2. Добавление задачи в WP-Cron

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

// Хук для выполнения функции
add_action('wpload_daily_delete_orders', 'wpload_delete_old_cancelled_failed_orders');

3. Очистка при деактивации

function wpload_deactivate_cleanup() {
    wp_clear_scheduled_hook('wpload_daily_delete_orders');
}
register_deactivation_hook(__FILE__, 'wpload_deactivate_cleanup');

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

  • Перед внедрением сделайте бэкап базы данных.
  • Добавьте в код временный error_log или var_dump, чтобы видеть, сколько заказов удаляется:
error_log('Удалено заказов: ' . count($orders));
  • Через 24 часа проверьте таблицу wp_posts на наличие старых заказов с нужными статусами.
  • В админке WooCommerce проверьте, исчезли ли эти заказы из списка.

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

  • Не срабатывает WP-Cron: на некоторых хостингах WP-Cron не запускается автоматически. Проверьте это, вызвав вручную wp cron event run --due-now в консоли или установите системный cron.
  • Удаляются новые заказы: Проверьте правильность параметра $days и критерий date_query.
  • Заказы не удаляются, потому что есть связанные данные: WooCommerce хранит метаданные и записи в других таблицах. Используйте wp_delete_post($order_id, true), чтобы удалить полностью.
  • Потеря важных данных: Никогда не удаляйте заказы без резервной копии, особенно если есть риск удаления активных заказов.

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

  • Если в базе много заказов для удаления, разбивайте процесс на части — удаляйте по 50-100 заказов за один запуск, чтобы избежать превышения лимита памяти и времени выполнения.
  • Для больших магазинов лучше запускать скрипт через системный cron, а не WP-Cron, чтобы избежать пропусков.
  • Ограничьте права доступа к коду удаления, чтобы исключить случайное удаление через админку.
  • Используйте плагин Clearfy Pro для дополнительной оптимизации базы и управления заказами.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПросто, без кодаМедленно, неудобно при большом количествеМалый объём заказов
Удаление через SQL-запросыБыстро, напрямуюРиск повредить данные, требует навыковОпытные администраторы баз данных
Автоматизация через WP-Cron + PHPАвтоматично, гибко, безопасноЗависит от работы WP-Cron, требует кодаЛюбой магазин с большим количеством заказов
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше