Диагностика проблемы: зачем удалять отменённые и просроченные заказы в 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... |