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