Диагностика проблемы: зачем удалять отменённые заказы автоматически
Отменённые заказы в WooCommerce накапливаются в базе данных, занимая место и замедляя работу административной панели и отчётов. Если магазин активно работает, количество таких заказов может быстро вырасти, что усложняет управление и увеличивает нагрузку на сервер. Автоматическое удаление отменённых заказов по расписанию помогает поддерживать базу в оптимальном состоянии без ручного вмешательства.
Пошаговое решение: как настроить автоматическое удаление отменённых заказов
1. Создаём функцию для удаления заказов со статусом 'cancelled'
В WooCommerce статус отменённого заказа может быть кастомным, но чаще используется cancelled. Настроим функцию, которая будет удалять все заказы со статусом cancelled, которым больше определённого времени (например, 7 дней).
function wpdirect_delete_cancelled_orders() {
$days_old = 7; // количество дней, по истечении которых заказы удаляются
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
'inclusive' => true,
);
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'date_query' => array($date_query),
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // принудительное удаление
}
}
}2. Регистрируем задачу Cron для регулярного запуска
Добавим событие, которое будет запускать функцию ежедневно.
function wpdirect_schedule_cancelled_orders_cleanup() {
if (!wp_next_scheduled('wpdirect_daily_cancelled_orders_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpdirect_daily_cancelled_orders_cleanup');
}
}
add_action('wp', 'wpdirect_schedule_cancelled_orders_cleanup');
add_action('wpdirect_daily_cancelled_orders_cleanup', 'wpdirect_delete_cancelled_orders');Проверка результата после внедрения
- Проверьте наличие отменённых заказов старше 7 дней в разделе «Заказы» WooCommerce до и после запуска Cron.
- Запустите функцию вручную через админку или WP CLI:
wp eval 'wpdirect_delete_cancelled_orders();'и убедитесь, что заказы удаляются. - Проверьте логи сервера на наличие ошибок при выполнении задачи.
Частые ошибки и как их исправить
- Функция не вызывается автоматически: убедитесь, что Cron работает корректно на хостинге. Запустите
wp cron event listчерез WP CLI и проверьте наличие задачиwpdirect_daily_cancelled_orders_cleanup. - Заказы не удаляются: проверьте, что статус заказа именно
wc-cancelled, а не кастомный. Можно получить список статусов черезwc_get_order_statuses(). - Удаление не полное (оставляются мета-данные): используйте
wp_delete_post($order_id, true)с флагом принудительного удаления. - Высокая нагрузка при большом количестве заказов: добавьте пагинацию в запросы и удаляйте партии заказов по 50–100 штук за один запуск.
Практические советы по безопасности и производительности
- Добавьте проверку прав пользователя или используйте
wp_verify_nonce, если будете запускать очистку вручную из админки. - Для больших магазинов реализуйте удаление пакетами с использованием параметра
posts_per_pageи повторным планированием задачи до полного удаления. - Используйте транзиенты или пользовательские опции для хранения временного состояния удаления, чтобы избежать повторного удаления одних и тех же заказов.
- Ведите логи удаления в отдельный файл или таблицу для аудита и отладки.
Сравнение вариантов удаления отменённых заказов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Ручное удаление через админку | Просто, без кода | Трудозатратно, высок риск пропуска заказов | Подходит для маленьких магазинов |
| Плагин очистки заказов | Автоматизация, удобный интерфейс | Дополнительная нагрузка, зависимость от стороннего кода | Использовать проверенные плагины |
| Код на Cron (как в статье) | Гибкость, контроль, отсутствие сторонних зависимостей | Требует навыков разработки, настройка cron | Оптимально для разработчиков и масштабных проектов |