Диагностика проблемы: зачем удалять незавершённые заказы
В WooCommerce незавершённые заказы (например, со статусом pending или failed) могут накапливаться, занимая место в базе данных и замедляя работу административной панели. Это особенно критично для магазинов с большим трафиком и частыми брошенными корзинами.
Если вы заметили, что в разделе заказов WooCommerce много заказов со статусом «Ожидает оплаты» или «Неуспешный», и они не удаляются автоматически, стоит настроить очистку заказов по расписанию.
Пошаговое решение: удаляем заказы по cron
1. Определяем статусы для удаления
Чаще всего удаляют заказы со статусами pending и failed, которым больше определённого времени (например, 7 дней).
2. Создаём функцию для удаления заказов
function wpmarketing_delete_old_unpaid_orders() {
$days = 7; // Количество дней для хранения заказов
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'status' => array('pending', 'failed'),
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление заказа
}
}
3. Регистрируем cron-задачу
Добавляем расписание в WordPress и запускаем очистку раз в сутки.
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['daily'])) {
$schedules['daily'] = array(
'interval' => 86400, // 24 часа
'display' => __('Once Daily'),
);
}
return $schedules;
});
if (!wp_next_scheduled('wpmarketing_delete_unpaid_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wpmarketing_delete_unpaid_orders_hook');
}
add_action('wpmarketing_delete_unpaid_orders_hook', 'wpmarketing_delete_old_unpaid_orders');
4. Добавляем код в functions.php или создаём небольшой плагин
Рекомендуется использовать дочернюю тему или собственный плагин для добавления этого кода, чтобы избежать потери при обновлении основной темы.
Проверка результата после внедрения
- Перейдите в WooCommerce → Заказы и отфильтруйте заказы со статусом
pendingиfailed. - Убедитесь, что заказы старше 7 дней отсутствуют.
- Для теста можно изменить переменную
$daysна 0, чтобы сразу удалить все такие заказы, или вручную создать заказ с нужным статусом и датой. - Проверьте логи сервера и наличие ошибок в админке.
Частые ошибки и как исправить
- Заказы не удаляются: Проверьте, активна ли cron-задача. Для этого используйте плагин WP Crontrol и убедитесь, что событие
wpmarketing_delete_unpaid_orders_hookзапланировано. - Удаляются не те заказы: Проверьте параметры фильтрации в
wc_get_orders(), особенно статус и дату создания. - Ошибка прав доступа при удалении: Функция
wp_delete_postтребует прав администратора. Убедитесь, что код выполняется в контексте с нужными правами. - Удаление заказов с важными данными: Перед внедрением сделайте резервную копию базы данных — удаление необратимо.
Практические советы по безопасности и производительности
- Добавляйте логирование удалённых заказов в отдельный файл для аудита, например, через
error_logили кастомный лог. - Если заказов много, разбивайте удаление на партии, чтобы избежать превышения времени выполнения скрипта.
- Используйте WP Cron только для небольших нагрузок. Для больших магазинов настраивайте системный cron, вызывающий
wp-cron.phpраз в сутки. - Регулярно проверяйте и очищайте базу данных, чтобы избежать замедления сайта.
Сравнение способов удаления незавершённых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоёмко, не автоматизировано |
| Плагин для очистки заказов | Удобный интерфейс, настройки | Дополнительные зависимости, нагрузка |
| Автоматизация через WP Cron + код | Нет лишних плагинов, гибкость | Нужно писать и поддерживать код |
| Системный cron + WP CLI | Максимальная производительность | Требует доступа к серверу и навыков работы с консолью |