wpload.ru wordpress WPLoad.ru

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

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

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

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

Как определить, что заказы требуют удаления

Отменённые заказы имеют статус cancelled, просроченные могут иметь статус failed или pending с датой создания старше определённого срока.

Для удаления имеет смысл учитывать не только статус, но и возраст заказа, например, удалять отменённые заказы старше 30 дней.

Проверка текущих заказов в базе

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' ORDER BY post_date DESC LIMIT 10;

Эта команда покажет последние 10 заказов с их статусом и датой создания.

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

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

Добавим функцию, которая будет находить и удалять заказы с нужными статусами и возрастом.

function wpload_delete_old_cancelled_orders() {
    $days = 30; // количество дней, старше которых заказы удаляются
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d', strtotime("-{$days} days")),
        'inclusive' => true,
    );

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => array('wc-cancelled', 'wc-failed', 'wc-pending'),
        'date_query' => array($date_query),
        'posts_per_page' => -1,
        'fields' => 'ids',
        'no_found_rows' => true,
        'ignore_sticky_posts' => true,
    );

    $orders = get_posts($args);

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

2. Планирование выполнения с помощью WP-Cron

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

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

add_action('wpload_daily_order_cleanup', 'wpload_delete_old_cancelled_orders');

3. Отмена расписания при деактивации

function wpload_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wpload_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpload_daily_order_cleanup');
    }
}
register_deactivation_hook(__FILE__, 'wpload_clear_order_cleanup_schedule');

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

  • Выполните вручную функцию wpload_delete_old_cancelled_orders() через консоль WP-CLI для проверки удаления заказов:
wp eval 'wpload_delete_old_cancelled_orders();'
  • Проверьте в админке WooCommerce наличие отменённых и просроченных заказов старше 30 дней — они должны исчезнуть.
  • Проверьте наличие запланированной задачи в WP-Cron с помощью плагина WP Crontrol или WP-CLI:
wp cron event list | grep wpload_daily_order_cleanup

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

  • Заказы не удаляются: проверьте, что статусы указаны с префиксом wc- (например, wc-cancelled), а не просто cancelled.
  • Функция не запускается по расписанию: убедитесь, что WP-Cron работает (нужны посещения сайта) или настройте системный cron для запуска wp-cron.php.
  • Удаляются нужные заказы: проверьте дату и статус, возможно, стоит увеличить срок хранения или уточнить статус, чтобы избежать удаления важных заказов.
  • Потеря данных: функция удаляет заказы без возможности восстановления — сделайте резервную копию базы перед внедрением.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления без перемещения в корзину — это экономит место.
  • Ограничьте количество удаляемых заказов за один запуск, если на сайте большой объём данных, чтобы избежать таймаута. Например, добавьте 'posts_per_page' => 100 и повторный запуск.
  • Настройте системный cron вместо WP-Cron для надёжного выполнения на больших сайтах.
  • Обязательно делайте резервное копирование базы данных перед внедрением автоматического удаления.

Сравнение вариантов очистки заказов

МетодПлюсыМинусыПример использования
Плагин очистки заказовУдобство, интерфейс, поддержкаМожет замедлять сайт, лишние зависимостиAdvanced Order Cleaner и др.
Код в functions.php + WP-CronЛёгкость, контроль, без зависимостейНужны навыки, нет интерфейсаНаш пример выше
Ручные SQL-запросыБыстро и без WPРиск ошибок, нет логикиDELETE FROM wp_posts WHERE...
×

Пора действовать!

Скидки на
WordPress!

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

Успей купить ⋙