Диагностика проблемы: почему заказы не удаляются автоматически
WooCommerce по умолчанию не удаляет отключённые (cancelled) или неоплаченные (pending, failed) заказы. Это приводит к раздуванию базы данных, замедлению запросов и усложнению управления заказами. Многие пользователи пытаются решить проблему вручную или через плагины, но это неудобно и ненадёжно.
Чтобы понять, что заказы не удаляются автоматически, проверьте таблицу wp_posts с типом shop_order и статусами заказов. Если в базе много старых заказов с нужными статусами, значит автоматизация отсутствует.
Пошаговое решение: как автоматически удалять отключённые и неоплаченные заказы
1. Использование WP-Cron для регулярного удаления заказов
Добавим в файл functions.php или в кастомный плагин код, который удаляет заказы старше заданного срока с определёнными статусами.
function wpscan_delete_old_cancelled_and_pending_orders() {
global $wpdb;
$days = 30; // удалять заказы старше 30 дней
$statuses = ['cancelled', 'pending', 'failed'];
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
foreach ($statuses as $status) {
$orders = wc_get_orders([
'limit' => -1,
'status' => $status,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
]);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - удаление без корзины
}
}
}
add_action('wpscan_daily_order_cleanup', 'wpscan_delete_old_cancelled_and_pending_orders');
// Регистрируем событие для cron, если оно не существует
if (!wp_next_scheduled('wpscan_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpscan_daily_order_cleanup');
}2. Проверка наличия и настройка WP-Cron
Убедитесь, что WP-Cron работает на вашем сайте. Для этого можно использовать плагины типа WP Crontrol или выполнить команду через SSH:
wget -q -O - https://your-site.ru/wp-cron.php?doing_wp_cronЕсли WP-Cron не работает, настройте системный cron на сервере для вызова wp-cron.php или используйте плагины, чтобы запускать задачи вручную.
Проверка результата после внедрения
- Подождите сутки после добавления кода (или запустите крон вручную через WP Crontrol).
- Проверьте базу данных, запросом в phpMyAdmin или через WP-CLI:
wp post list --post_type=shop_order --post_status=cancelled,pending,failed --field=IDЕсли список заказов пуст или содержит только свежие заказы, значит удаление работает.
Частые ошибки и как их исправить
- Код не выполняется: проверьте, что событие крон зарегистрировано (
wp_next_scheduled), а WP-Cron включён и работает. - Удаляются не те заказы: проверьте правильность статусов, используйте консоль или дебаггер для подтверждения.
- Потеря данных: функция
wp_delete_postудаляет заказы без возможности восстановления. Для безопасности сначала протестируйте на копии сайта. - Перегрузка сервера: при большом количестве заказов разбивайте удаление на партии, например, по 50 заказов за раз.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($order_id, true);для полного удаления, чтобы не оставлять мусор в базе. - Ограничьте количество заказов для удаления за один запуск, чтобы избежать таймаута:
function wpscan_delete_old_orders_batch() {
$batch_size = 50;
$statuses = ['cancelled', 'pending', 'failed'];
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
foreach ($statuses as $status) {
$orders = wc_get_orders([
'limit' => $batch_size,
'status' => $status,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
]);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}
}- Убедитесь, что резервные копии базы данных создаются регулярно.
- Для больших магазинов рассмотрите использование плагинов оптимизации, например Clearfy Pro для удаления мусора и оптимизации базы данных.
Сравнение вариантов удаления заказов WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление | Контроль каждого заказа | Трудоёмко, риск пропуска |
| Плагины очистки базы | Автоматизация, удобство | Может конфликтовать, нагрузка |
| Код с WP-Cron (рекомендация) | Лёгкая кастомизация, без сторонних плагинов | Требует знаний, нужно следить за WP-Cron |