Диагностика проблемы: зачем автоматизировать удаление заказов в WooCommerce
В крупных интернет-магазинах на WooCommerce количество заказов быстро растёт, включая множество отменённых, просроченных или неактивных заказов. Это влияет на размер базы данных, замедляет административную панель и может создавать путаницу при аналитике. Ручное удаление неэффективно и трудозатратно.
Чаще всего возникает задача автоматизировать удаление заказов по определённым статусам (например, "отменён", "отклонён", "неоплачен") спустя заданный срок.
Как проверить, что проблема есть
- Войдите в админку WooCommerce > Заказы;
- Отфильтруйте заказы по статусам "отменён", "ожидание оплаты" и посмотрите дату создания;
- Если таких заказов много и они старше 30 дней, это повод автоматизировать их удаление.
Пошаговое решение: автоматическое удаление заказов по статусу и сроку
1. Используем WP-Cron для регулярного запуска задачи
Создадим функцию, которая будет запускаться раз в сутки и удалять все заказы со статусом cancelled и датой создания старше 30 дней.
function wponline_delete_old_cancelled_orders() {
$args = [
'limit' => -1,
'status' => 'cancelled',
'date_created' => '<' . ( new WC_DateTime('-30 days') )->format('Y-m-d H:i:s'),
'return' => 'ids',
];
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление без корзины
}
}
}
// Регистрируем событие при активации темы/плагина
function wponline_schedule_order_cleanup() {
if (!wp_next_scheduled('wponline_order_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wponline_order_cleanup_hook');
}
}
add_action('wp', 'wponline_schedule_order_cleanup');
// Привязываем функцию к крону
add_action('wponline_order_cleanup_hook', 'wponline_delete_old_cancelled_orders');
// Очистка при деактивации
function wponline_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wponline_order_cleanup_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wponline_order_cleanup_hook');
}
}2. Как адаптировать под другие статусы
Для удаления заказов с другими статусами, например failed или pending, измените параметр 'status' на массив:
'status' => ['cancelled', 'failed', 'pending'],Функция удалит заказы с любым из указанных статусов.
3. Настройка интервала и времени запуска
По умолчанию задача запускается ежедневно. При необходимости можно добавить пользовательский интервал:
add_filter('cron_schedules', function($schedules) {
$schedules['weekly'] = [
'interval' => 604800, // 7 дней в секундах
'display' => __('Once Weekly')
];
return $schedules;
});
// В функции wponline_schedule_order_cleanup замените 'daily' на 'weekly'Проверка результата после внедрения
- Создайте тестовый заказ со статусом
cancelledи датой создания старше 30 дней (можно использовать WP-CLI или ручную установку даты в базе); - Запустите событие WP-Cron вручную через плагин WP Crontrol или WP-CLI (
wp cron event run wponline_order_cleanup_hook); - Проверьте, что заказ удалён из админки WooCommerce и из таблиц базы данных
wp_postsиwp_postmeta; - Убедитесь, что заказы с другими статусами и младше 30 дней не удалились.
Частые ошибки и способы их устранения
- Функция не запускается по расписанию: проверьте наличие WP-Cron. На некоторых хостингах WP-Cron отключён. Можно настроить системный cron и запускать
wp cron event runвручную. - Заказы не удаляются полностью: убедитесь, что используете
wp_delete_post($order_id, true)с параметромtrueдля полного удаления, а не в корзину. - Удаление происходит слишком рано или поздно: проверьте правильность сравнения даты в параметре
date_created. Используйте классWC_DateTimeс корректным форматом. - Потеря данных при автоматическом удалении: рекомендуется делать резервные копии базы перед внедрением.
Практические советы по безопасности и производительности
- Ограничьте удаление заказов только нужными статусами и сроками, чтобы не потерять важные данные.
- Тестируйте на копии сайта перед запуском на живом магазине.
- Для больших магазинов с тысячами заказов используйте пагинацию в запросах, чтобы не перегружать сервер:
$paged = 1;
do {
$args['limit'] = 100;
$args['paged'] = $paged;
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
$paged++;
} while (!empty($orders));- Если хотите автоматизировать и расширить функциональность — рассмотрите плагин Clearfy Pro от WPShop, который помогает чистить сайт, оптимизировать базу и управлять SEO.
Сравнение подходов: код vs плагины для удаления заказов
| Критерий | Код (как в статье) | Плагин (например, Clearfy Pro) | Компромисс |
|---|---|---|---|
| Гибкость | Максимальная, можно адаптировать под любые задачи | Ограничена функционалом плагина | Код требует поддержки, плагин — обновлений |
| Простота внедрения | Требует навыков PHP и доступа к сайту | Устанавливается и настраивается через админку | Плагин быстрее, код — более кастомный |
| Производительность | Контролируете оптимизацию самостоятельно | Может быть избыточным и замедлять сайт | Код легче на ресурсы при правильной реализации |
| Безопасность | Зависит от качества кода | Проверена разработчиками, но может иметь уязвимости | Комбинируйте — плагин + кастомные доработки |