Диагностика проблемы: зачем удалять просроченные заказы
В WooCommerce, при большом потоке заказов, накапливаются заказы со статусом pending или failed, которые не были оплачены и остаются в базе длительное время. Это увеличивает размер базы данных и замедляет работу сайта, а также усложняет администрирование.
Проверка:
Перейдите в WooCommerce → Заказы и отсортируйте заказы по статусу pending или failed. Обратите внимание на дату создания заказа. Если есть заказы старше 7 дней, которые не были оплачены, их имеет смысл удалять автоматически.
Пошаговое решение: автоматическое удаление просроченных заказов с помощью WP-Cron
1. Создаем функцию удаления заказов старше заданного срока
function wpdemo_delete_expired_orders() {
// Период в днях, по истечении которого заказы считаются просроченными
$expiration_days = 7;
$date = date('Y-m-d H:i:s', strtotime('-' . $expiration_days . ' days'));
$args = [
'status' => ['pending', 'failed'],
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
];
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Удаляем навсегда
}
}2. Регистрируем WP-Cron задачу для регулярного запуска
function wpdemo_schedule_expired_orders_deletion() {
if (!wp_next_scheduled('wpdemo_delete_expired_orders_event')) {
wp_schedule_event(time(), 'daily', 'wpdemo_delete_expired_orders_event');
}
}
add_action('wp', 'wpdemo_schedule_expired_orders_deletion');
add_action('wpdemo_delete_expired_orders_event', 'wpdemo_delete_expired_orders');3. Добавляем деактивацию задачи при отключении плагина или темы
function wpdemo_clear_scheduled_event() {
$timestamp = wp_next_scheduled('wpdemo_delete_expired_orders_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpdemo_delete_expired_orders_event');
}
}
register_deactivation_hook(__FILE__, 'wpdemo_clear_scheduled_event');Проверка результата после внедрения
- Через wp-admin зайдите в WooCommerce → Заказы и убедитесь, что заказы со статусом
pendingилиfailedстарше 7 дней удалены. - Посмотрите в базу данных таблицу
wp_postsс типомshop_order, заказы старше 7 дней должны отсутствовать. - Для проверки запуска WP-Cron можно использовать плагин WP Crontrol, в нем должна появиться задача
wpdemo_delete_expired_orders_eventс ежедневным запуском.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что функция
wc_get_ordersвозвращает ID заказов. Включите отладку, добавьтеerror_log()внутри цикла для проверки. Убедитесь, что хук WP-Cron срабатывает (проверьте через WP Crontrol). - Удаляются не те заказы: проверьте параметры
'status'и'date_created'в массиве аргументов. Используйте var_dump для вывода $orders перед удалением. - WP-Cron не запускается автоматически: На некоторых хостингах WP-Cron не срабатывает без внешних запросов. Настройте системный cron (crontab) или плагин для имитации запуска cron.
Практические советы по безопасности и производительности
- Удаление заказов происходит навсегда (
wp_delete_post(..., true)), поэтому убедитесь, что вы не удаляете важные данные по ошибке. - Настройте период удаления разумно (например, 7 дней), чтобы не потерять данные по неоплаченным заказам, которые могут быть важны для аналитики.
- Для больших магазинов с тысячами заказов лучше делать удаление пакетами, например по 50 заказов за раз, чтобы не перегружать сервер.
- Используйте
wp_schedule_eventс периодом не чаще одного раза в день, чтобы минимизировать нагрузку. - Регулярно делайте резервные копии базы данных перед внедрением автоматического удаления.
Сравнение способов автоматического удаления просроченных заказов
| Способ | Плюсы | Минусы |
|---|---|---|
| Код через WP-Cron (как в статье) | Полный контроль, без сторонних плагинов, гибкость настройки | Требует базовых знаний PHP и cron, возможны ошибки при большом объеме данных |
| Плагин для очистки заказов | Простота установки и настройки | Может не соответствовать нуждам, лишний код, нагрузка |
| Ручное удаление через админку | Простота, без кода | Требуется время и внимание, риск пропуска заказов |