Диагностика проблемы с накоплением заказов в WooCommerce
Магазины на WooCommerce со временем накапливают большое количество заказов, включая отменённые, просроченные или неактивные. Это замедляет работу базы данных, увеличивает размер дампов и усложняет администрирование. Нужно регулярно удалять такие заказы, но вручную это неудобно и неэффективно.
Типичные признаки проблемы:
- Длительное время отклика при открытии списка заказов в админке.
- Рост размера базы данных, особенно таблиц
wp_postsиwp_postmeta. - Задержки при резервном копировании сайта.
Как настроить автоматическое удаление неактивных и старых заказов
Определяем критерии удаления
Под неактивными заказами обычно понимают статусы cancelled, failed и refunded. Старые заказы — это те, которым больше определённого срока, например 30 или 90 дней.
Пошаговое решение: добавляем крон-задачу и функцию удаления
WooCommerce не предлагает встроенного механизма массового удаления заказов по времени и статусу, поэтому создадим кастомный код в файле functions.php вашей темы или в собственном плагине.
1. Регистрируем крон-задачу, выполняющуюся ежедневно:
add_action('wp', function() {
if (! wp_next_scheduled('wc_delete_old_orders_daily')) {
wp_schedule_event(time(), 'daily', 'wc_delete_old_orders_daily');
}
});2. Создаём функцию удаления:
add_action('wc_delete_old_orders_daily', function() {
$days = 30; // Период в днях для удаления заказов
$statuses = array('cancelled', 'failed', 'refunded');
$date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'date_query' => array(
'before' => $date_limit,
'inclusive' => true,
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // true - удаление без перемещения в корзину
}
}
wp_reset_postdata();
});3. Добавьте очистку крон-задачи при деактивации темы или плагина для чистоты:
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('wc_delete_old_orders_daily');
});Проверка результата после внедрения
Чтобы убедиться, что удаление работает:
- Проверьте наличие крон-задачи через плагин WP Crontrol.
- Создайте тестовый заказ со статусом
cancelledи датой старше 30 дней (можно через SQL вpost_dateизменить дату). - Запустите крон-задачу вручную через WP Crontrol или с помощью
wp cron event run wc_delete_old_orders_dailyв WP-CLI. - Убедитесь, что заказ удалён из базы, а в админке он не отображается.
Частые ошибки и как их исправить
- Проблема: Крон-задача не запускается.
Решение: Убедитесь, что на сайте включён WP-Cron, или настройте системный cron для вызоваwp-cron.php. Проверьте регистрацию события и наличие задачи через WP Crontrol. - Проблема: Заказы не удаляются.
Решение: Проверьте права пользователя, под которым выполняется скрипт. Убедитесь, чтоwp_delete_postвызывается с параметромtrueдля полного удаления. - Проблема: Удаляются не те заказы.
Решение: Проверьте правильность статусов в массиве$statusesи корректность даты в запросе.
Практические советы по безопасности и производительности
- Удаление большого количества заказов за раз может тормозить сайт. Если заказов много, разбейте процесс на партии по 50-100 штук, вызывая функцию несколько раз с пагинацией.
- Резервное копирование базы данных перед внедрением автоматического удаления — обязательное условие.
- Используйте
wp_delete_postс параметромtrueдля полного удаления, иначе данные могут остаться в базе. - Проверяйте логи сервера на наличие ошибок при работе крон-задачи.
Сравнение способов автоматического удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, Advanced Order Cleanup) | Простота настройки, готовый интерфейс | Зависимость от стороннего кода, возможные конфликты |
| Ручной SQL-запрос | Быстрота выполнения, прямой контроль | Риск ошибок, отсутствие автоматизации |
| Кастомный код с WP-Cron (данный метод) | Гибкость, автоматизация, интеграция с WP | Требуется базовое знание PHP, настройка cron |