Почему важно удалять отменённые и отложенные заказы в WooCommerce
Большое количество отменённых и отложенных заказов со временем засоряет базу данных WooCommerce, что замедляет работу сайта и усложняет аналитику. Удаление таких заказов помогает снизить нагрузку на базу данных и ускорить выполнение запросов.
Диагностика проблемы: как определить, что база данных нуждается в очистке
Для диагностики используйте следующие шаги:
- Откройте phpMyAdmin или другой инструмент управления базой данных.
- Выполните SQL-запрос для подсчёта заказов по статусам:
SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Обратите внимание на количество заказов со статусами wc-cancelled и wc-on-hold (отложенные). Если их тысячи, это повод для автоматизации удаления.
Пошаговое решение: автоматическое удаление устаревших заказов с помощью cron
1. Создаём функцию удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wpdebug_delete_old_orders() {
global $wpdb;
$days = 30; // Удалять заказы старше 30 дней
$cutoff_date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID отменённых заказов старше cutoff_date
$cancelled_orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
$cutoff_date
));
// Получаем ID отложенных заказов старше cutoff_date
$on_hold_orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-on-hold' AND post_date < %s",
$cutoff_date
));
$orders_to_delete = array_merge($cancelled_orders, $on_hold_orders);
foreach ($orders_to_delete as $order_id) {
wp_trash_post($order_id); // Можно использовать wp_delete_post($order_id, true) для полного удаления
}
}
2. Регистрируем WP-Cron для регулярного запуска
Добавьте код для создания и запуска cron-события раз в сутки:
if (!wp_next_scheduled('wpdebug_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpdebug_daily_order_cleanup');
}
add_action('wpdebug_daily_order_cleanup', 'wpdebug_delete_old_orders');
3. Очистка при деактивации
Чтобы избежать висячих cron-задач, добавьте удаление расписания при деактивации плагина:
function wpdebug_deactivation_cleanup() {
$timestamp = wp_next_scheduled('wpdebug_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpdebug_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpdebug_deactivation_cleanup');
Проверка результата после внедрения
1. После активации кода дождитесь запуска cron (можно запустить вручную через WP-CLI командой wp cron event run wpdebug_daily_order_cleanup).
2. Проверьте количество заказов с помощью SQL-запроса из секции диагностики. Количество отменённых и отложенных заказов старше 30 дней должно уменьшиться.
3. В админке WooCommerce отменённые и отложенные заказы старше 30 дней должны оказаться в корзине или удалены (зависит от метода удаления).
Частые ошибки и как их исправить
- Неверный префикс таблиц: В коде используется
$wpdb->postsдля получения правильного префикса. Не используйте жёстко прописанныйwp_posts. - Удаление вместо перемещения в корзину: Функция
wp_trash_post()перемещает заказ в корзину, но не удаляет окончательно. Для полного удаления используйтеwp_delete_post($order_id, true), однако будьте осторожны, чтобы не потерять данные без возможности восстановления. - Отсутствие cron-задания: Проверьте, что событие
wpdebug_daily_order_cleanupзапланировано, через плагин WP Crontrol или WP-CLI (wp cron event list). - Проблемы с таймзоной: Убедитесь, что сервер и WordPress используют одинаковую таймзону, иначе даты могут сравниваться некорректно.
Практические советы по безопасности и производительности
- Для больших баз данных используйте пакетное удаление (например, по 50 заказов за раз), чтобы не перегружать сервер.
- Перед удалением сделайте резервную копию базы данных.
- Проверяйте работу cron с помощью плагина WP Crontrol, чтобы убедиться, что таск запускается регулярно.
- Не удаляйте заказы слишком рано — 30 дней это рекомендуемый минимум, чтобы сохранить возможность анализа и возврата средств.
- Для более тонкой настройки можно расширить функцию, чтобы удалять заказы по дополнительным критериям (например, по метаданным или способу оплаты).
Сравнение способов реализации удаления заказов
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| WP-Cron + кастомный код | Гибкость, нет дополнительных плагинов | Зависит от правильной работы WP-Cron, требует навыков | Код из статьи |
| Плагины очистки базы | Простота, готовые интерфейсы | Могут быть тяжёлыми, лишние функции | WP Sweep, Advanced Database Cleaner |
| Ручное удаление через SQL | Максимальная скорость, прямой контроль | Риск ошибок, требует резервного копирования | SQL-запросы для удаления заказов |