Почему важно удалять неактивные заказы в WooCommerce
Неактивные заказы (например, ожидающие оплаты или заброшенные корзины) могут накапливаться и загромождать базу данных, замедляя работу магазина и усложняя отчеты. Регулярное удаление таких заказов помогает поддерживать производительность и чистоту данных.
Что считается неактивным заказом
В WooCommerce к неактивным можно отнести заказы со статусами:
- pending (ожидает оплаты);
- failed (неудачная оплата);
- cancelled (отменён);
- on-hold (на удержании) — если не изменяется долго.
Обычно удаляют заказы, которые не менялись в течение определённого времени (от 7 до 30 дней).
Диагностика проблемы
Перед автоматизацией проверьте, сколько таких заказов накапливается и как они влияют на базу данных:
- Подключитесь к базе данных MySQL через phpMyAdmin или консоль.
- Выполните запрос для подсчёта заказов со статусом
pendingстарше 14 дней:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < NOW() - INTERVAL 14 DAY;Если число большое (сотни и более), удаление актуально.
Пошаговое решение: автоматическое удаление неактивных заказов
Добавим в файл functions.php вашей темы или в кастомный плагин следующий код для удаления заказов со статусами pending, failed и cancelled, которые созданы более 14 дней назад.
function wpkit_delete_old_inactive_orders() {
global $wpdb;
$statuses = array('wc-pending', 'wc-failed', 'wc-cancelled');
$days = 14;
foreach ($statuses as $status) {
$orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < NOW() - INTERVAL %d DAY",
$status,
$days
));
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удаление без перемещения в корзину
}
}
}
}
// Запускаем при событии 'woocommerce_cleanup_sessions' — оно уже настроено на ежедневный крон
add_action('woocommerce_cleanup_sessions', 'wpkit_delete_old_inactive_orders');Этот хук запускается ежедневно и не создаёт дополнительной нагрузки. Альтернативно можно создать собственное крон-задачу.
Создание отдельного WP-Cron для удаления заказов
Если требуется полный контроль, добавьте крон задачу вручную:
function wpkit_register_delete_orders_cron() {
if (!wp_next_scheduled('wpkit_delete_old_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wpkit_delete_old_orders_hook');
}
}
add_action('wp', 'wpkit_register_delete_orders_cron');
add_action('wpkit_delete_old_orders_hook', 'wpkit_delete_old_inactive_orders');Проверка результата после внедрения
- Создайте тестовый заказ с нужным статусом и датой старше 14 дней (можно вручную изменить дату в базе).
- Запустите крон вручную через плагин WP Crontrol или дождитесь автоматического запуска.
- Проверьте, что заказ удалён из раздела «Заказы» WooCommerce.
- Выполните SQL-запрос из раздела диагностики, чтобы убедиться, что количество старых заказов уменьшилось.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, срабатывает ли крон. Используйте плагин WP Crontrol для просмотра и запуска задач вручную.
- Удаляются не те заказы: проверьте правильность статусов и даты в SQL-запросе и фильтре.
- Удаление вызывает ошибки или зависания: если заказов очень много, используйте пакетное удаление с ограничением количества за раз (например, 50 заказов в цикле).
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед внедрением автоматического удаления.
- Для крупных магазинов используйте пакетное удаление и логирование действий для отладки.
- Не удаляйте заказы с успешной оплатой и выполнением.
- Для дополнительной безопасности можно добавить проверку текущего пользователя или IP при ручном запуске.
- Периодически очищайте также связанные метаданные и пользовательские данные, чтобы избежать мусора в базе.
Сравнение методов удаления старых заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление в админке | Удаление заказов через интерфейс WooCommerce | Простота, контроль | Трудозатратно, риск пропуска |
| Плагин для очистки | Использование сторонних плагинов типа WP Rocket или Clearfy Pro | Автоматизация, настройки | Зависимость от стороннего кода, возможны конфликты |
| Кастомный код с WP-Cron | Автоматическое удаление через функции и крон | Гибкость, полный контроль | Требует навыков, возможны ошибки без тестов |