Диагностика проблемы: зачем удалять старые отменённые заказы
В интернет-магазинах на WooCommerce со временем база заказов разрастается, особенно если не проводить чистку отменённых заказов. Это влияет на размер базы данных, время резервного копирования и скорость работы административной панели. Если отменённые заказы не нужны для аналитики или отчетности, их можно безопасно удалить.
Как проверить количество отменённых заказов и их возраст
Для оценки ситуации выполните SQL-запрос к базе данных через phpMyAdmin или любой другой инструмент:
SELECT COUNT(*) AS count, MIN(post_date) AS oldest_order FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';Этот запрос покажет общее число отменённых заказов и дату самого старого из них. Если количество большое, есть смысл автоматизировать удаление.
Пошаговое решение: автоматическое удаление отменённых заказов старше N дней
Для автоматизации удаления добавим код в файл functions.php вашей дочерней темы или создадим свой плагин. В примере ниже заказы старше 30 дней будут удаляться при запуске WP-Cron задачи.
function wpmagazin_delete_old_cancelled_orders() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID заказов со статусом wc-cancelled старше порога
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
$date_threshold
));
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
// Используем WC_Order для корректного удаления
$order = wc_get_order($order_id);
if ($order) {
wp_delete_post($order_id, true); // true - чтобы удалить без перемещения в корзину
}
}
}
}
// Регистрируем событие в WP-Cron, если его ещё нет
if (!wp_next_scheduled('wpmagazin_delete_old_cancelled_orders_cron')) {
wp_schedule_event(time(), 'daily', 'wpmagazin_delete_old_cancelled_orders_cron');
}
add_action('wpmagazin_delete_old_cancelled_orders_cron', 'wpmagazin_delete_old_cancelled_orders');Объяснение кода
- Получаем ID заказов со статусом
wc-cancelled, созданных более 30 дней назад. - Удаляем их через
wp_delete_postс параметромtrueдля полного удаления. - Создаем ежедневное событие WP-Cron для автоматического запуска.
Как проверить, что удаление работает
1. В админке WooCommerce перейдите в раздел «Заказы» и отфильтруйте по статусу «Отменён».
2. Запомните количество заказов старше 30 дней.
3. Запустите событие вручную через консоль или добавьте временно вызов функции в functions.php:
add_action('init', function() {
if (current_user_can('administrator')) {
wpmagazin_delete_old_cancelled_orders();
}
});4. После обновления страницы снова проверьте количество отменённых заказов.
5. Убедитесь, что удалились именно старые заказы, а новые остались.
Частые ошибки и их исправление
- Заказы не удаляются: проверьте, активирована ли WP-Cron и не отключен ли он в
wp-config.php(DISABLE_WP_CRONдолжен бытьfalseили отсутствовать). - Удаляются лишние заказы: проверьте условие по дате и статусу, возможно ошибка в формате даты или статус указан неверно.
- Функция вызывается слишком часто: WP-Cron по умолчанию запускается при посещении сайта, можно заменить периодичность на 'weekly' или отключить временные вызовы.
Практические советы по безопасности и производительности
- Резервное копирование базы данных перед применением автоматического удаления — обязательно.
- Тестируйте код на staging-сайте с копией базы.
- Если заказов очень много, добавьте пагинацию в выборку и удаляйте партиями, чтобы избежать таймаута PHP.
- Используйте хук
shutdownдля запуска удаления после основного процесса, чтобы не влиять на скорость загрузки страниц. - Для мониторинга можно логировать удалённые заказы в отдельный файл или отправлять уведомления администратору.
Сравнение вариантов удаления отменённых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Просто, не требует кода | Трудоемко при большом количестве заказов |
| Плагин (например, WP All Import/Export или специализированные) | Графический интерфейс, гибкие фильтры | Нагрузка на сайт, требует установки стороннего ПО |
| Автоматизация через WP-Cron и код | Автоматически, без сторонних плагинов, гибкая настройка | Требует навыков, возможны ошибки в коде |