Диагностика проблемы: зачем удалять неоплаченные заказы
В WooCommerce неоплаченные заказы (статус pending или failed) накапливаются в базе данных, что замедляет работу сайта и затрудняет управление заказами. Особенно это актуально для магазинов с большим трафиком и количеством заказов. Автоматическое удаление таких заказов через 30 дней помогает поддерживать базу в чистоте и улучшать производительность.
Пошаговое решение: автоматизация удаления заказов через WP Cron
1. Создаем функцию удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wpkpi_delete_old_unpaid_orders() {
// Параметры поиска заказов
$args = array(
'status' => array('pending', 'failed'),
'date_created' => '<' . ( time() - 30 * DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление заказа
}
}2. Регистрируем событие WP Cron
Добавьте код для планирования ежедневного запуска задачи:
function wpkpi_schedule_delete_old_orders() {
if (!wp_next_scheduled('wpkpi_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpkpi_daily_delete_old_orders');
}
}
add_action('wp', 'wpkpi_schedule_delete_old_orders');
add_action('wpkpi_daily_delete_old_orders', 'wpkpi_delete_old_unpaid_orders');3. Очистка расписания при деактивации
Чтобы избежать накопления задач, добавьте очистку при деактивации плагина:
function wpkpi_clear_scheduled_delete() {
$timestamp = wp_next_scheduled('wpkpi_daily_delete_old_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpkpi_daily_delete_old_orders');
}
}
register_deactivation_hook(__FILE__, 'wpkpi_clear_scheduled_delete');Проверка результата после внедрения
- Создайте тестовый заказ со статусом
pendingс датой создания более 30 дней назад (можно вручную изменить дату в базе или использовать тестовый заказ старше 30 дней). - Запустите вручную функцию
wpkpi_delete_old_unpaid_orders()через консоль WP-CLI:wp eval 'wpkpi_delete_old_unpaid_orders();' - Проверьте, что заказ удалился из админки WooCommerce и из базы данных (таблица
wp_postsс типомshop_order). - Убедитесь, что WP Cron срабатывает ежедневно (можно использовать плагин WP Crontrol для просмотра и тестирования).
Частые ошибки и как исправить
- Заказы не удаляются: проверьте, что функция
wpkpi_delete_old_unpaid_ordersвызывается и в ней правильно формируется дата. Для отладки добавьтеerror_log()внутри цикла. - WP Cron не срабатывает: убедитесь, что на сайте есть трафик для запуска WP Cron, либо настройте системный cron для вызова
wp-cron.php. - Заказы не удаляются полностью: используйте
wp_delete_post($order_id, true)с вторым параметромtrueдля полного удаления без помещения в корзину. - Проблемы с производительностью при большом количестве заказов: добавьте ограничение
'limit' => 100и используйте пагинацию по пакетам для поэтапного удаления.
Практические советы по безопасности и производительности
- Не удаляйте заказы со статусами
completed,processing,on-hold, чтобы не потерять данные о реальных продажах. - Перед удалением заказов можно добавить резервное копирование таблиц базы данных.
- Для магазинов с большим объемом заказов используйте пакетную обработку с WP Cron и лимитом на удаление заказов за один запуск.
- Используйте плагин Clearfy Pro для комплексной оптимизации базы и очистки WooCommerce данных.
Сравнение способов удаления неоплаченных заказов
| Метод | Плюсы | Минусы | Пример кода/плагина |
|---|---|---|---|
| Ручное удаление через админку | Простота | Трудоемко, не подходит для большого количества | Нет |
| WP Cron + кастомный код | Автоматизация, гибкость | Нужны базовые навыки программирования | Пример из статьи |
| Плагины оптимизации (Clearfy, WP Sweep) | Удобство, дополнительные функции | Может удалять лишнее, требует проверки | Clearfy |