Проблема: накопление старых неактивных заказов в WooCommerce
В интернет-магазине на WooCommerce с течением времени в базе накапливаются заказы со статусами, которые не требуют дальнейшей обработки, например, "отменён" или "ожидает оплаты", и которые уже не актуальны. Это увеличивает размер базы данных и замедляет работу сайта, особенно при большом объёме заказов.
Решение — автоматическое удаление таких заказов по дате, чтобы база оставалась чистой и производительность — высокой.
Диагностика проблемы
- Проверьте количество заказов со статусом
pending,failedиcancelledстарше определённого срока, например, 30 дней. - Для этого используйте SQL-запрос в базе данных (через phpMyAdmin или терминал):
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);Если число заказов большое (сотни и более), стоит автоматизировать их удаление.
Пошаговое решение: реализация автоматического удаления заказов с помощью WP-Cron
1. Создаём функцию удаления старых заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpb_delete_old_inactive_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed', 'wc-cancelled'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => '30 days ago',
),
),
'fields' => 'ids',
'posts_per_page' => 100, // пакетная обработка
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // без возможности восстановления
}
}
}2. Регистрируем WP-Cron событие
Добавим крон-задачу, которая будет запускать функцию ежедневно:
function wpb_schedule_order_cleanup() {
if (!wp_next_scheduled('wpb_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_order_cleanup');
}
}
add_action('wp', 'wpb_schedule_order_cleanup');
add_action('wpb_daily_order_cleanup', 'wpb_delete_old_inactive_orders');3. Очистка при деактивации темы или плагина
Чтобы не оставлять лишние задания, добавьте отмену cron при деактивации:
function wpb_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpb_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpb_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpb_clear_order_cleanup_schedule');Проверка результата после внедрения
- Запустите функцию вручную, вызвав
wpb_delete_old_inactive_orders()из консоли WP-CLI или временно черезadd_action('init', 'wpb_delete_old_inactive_orders');и обновив сайт. - Проверьте в административной панели WooCommerce количество заказов с нужными статусами старше 30 дней — должны быть удалены.
- Просмотрите логи сервера на наличие ошибок, связанных с удалением.
- Для теста можно изменить дату в запросе на более свежую и проверить удаление.
Частые ошибки и как их исправить
- Удаление не происходит: проверьте, что WP-Cron работает корректно. Для этого установите плагин WP Crontrol и убедитесь, что событие
wpb_daily_order_cleanupзапланировано. - Заказы не удаляются полностью: используйте
wp_delete_post($order_id, true)с параметромtrueдля полного удаления, иначе заказы перемещаются в корзину. - Перегрузка сервера при большом количестве заказов: ограничьте количество одновременно удаляемых заказов параметром
posts_per_pageи используйте пакетную обработку. - Удаление нужных заказов: убедитесь, что статус и дата фильтруются корректно, чтобы не удалить актуальные заказы.
Практические советы по безопасности и производительности
- Выполняйте удаление заказов пакетами (например, по 100 штук), чтобы не перегружать сервер.
- Регулярно создавайте резервные копии базы данных перед автоматизацией удаления.
- Если сайт высоконагруженный, используйте WP-CLI скрипты для удаления заказов вне веб-запросов.
- Для безопасности ограничьте доступ к функциям удаления, не размещайте код в общедоступных шаблонах.
- Используйте плагин Clearfy Pro для оптимизации базы и удаления мусорных данных как дополнение к собственным скриптам (https://wpshop.ru/plugins/clearfy).
Таблица сравнения способов удаления старых заказов
| Метод | Плюсы | Минусы | Уровень контроля |
|---|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Много времени при большом объёме заказов | Низкий |
| WP-Cron с пользовательским кодом | Автоматизация, гибкость, пакетная обработка | Требует навыков разработки, зависит от WP-Cron | Высокий |
| Плагины очистки базы | Удобство, дополнительные функции оптимизации | Могут быть платными, не всегда под ваш кейс | Средний |