Диагностика проблемы с накоплением статусов заказов в WooCommerce
WooCommerce по умолчанию хранит все заказы и их статусы в базе данных, даже если заказ давно завершён или отменён. Со временем это приводит к раздуванию базы, что замедляет загрузку страниц с заказами, отчётов и влияет на производительность сайта. Особенно это актуально для магазинов с тысячами заказов.
Типичные признаки проблемы:
- Медленная работа админки в разделе заказов.
- Долгие запросы к базе данных при выводе статистики.
- Повышенный размер таблиц
wp_postsиwp_postmeta.
Пошаговое решение: автоматическое удаление старых заказов по статусу
Рассмотрим, как с помощью пользовательской функции и WP-Cron настроить регулярную очистку заказов с определённым статусом, например, cancelled или failed, старше 30 дней.
1. Создаём функцию для удаления заказов
function wptemp_delete_old_orders_by_status() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-failed'],
'date_query' => [
[
'column' => 'post_date',
'before' => '30 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$orders = get_posts($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true для полного удаления
}
}2. Регистрируем ежедневное событие WP-Cron
function wptemp_schedule_order_cleanup() {
if (!wp_next_scheduled('wptemp_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptemp_daily_order_cleanup');
}
}
add_action('wp', 'wptemp_schedule_order_cleanup');
add_action('wptemp_daily_order_cleanup', 'wptemp_delete_old_orders_by_status');3. Опционально: добавляем ручной запуск через URL для отладки
function wptemp_manual_order_cleanup_trigger() {
if (isset($_GET['wptemp_cleanup']) && current_user_can('manage_options')) {
wptemp_delete_old_orders_by_status();
wp_die('Очистка заказов выполнена.');
}
}
add_action('init', 'wptemp_manual_order_cleanup_trigger');Проверка результата после внедрения
После добавления кода в файл functions.php вашей активной темы или в кастомный плагин:
- Перейдите в раздел «Заказы» в админке WooCommerce и проверьте количество заказов со статусом
cancelledиfailed, которым больше 30 дней — они должны исчезнуть после запуска Cron. - Для теста вызовите URL
https://ваш-сайт.ru/?wptemp_cleanup=1под пользователем с правами администратора — должна появиться надпись об успешной очистке. - Проверьте размер таблиц
wp_postsиwp_postmetaдо и после очистки через phpMyAdmin или аналогичный инструмент.
Частые ошибки и как их исправить
- Функция не вызывается по расписанию: Проверьте, активен ли WP-Cron, и что на сайте есть трафик, поскольку WP-Cron запускается при заходе на сайт. Для теста используйте плагин WP Crontrol.
- Удаляются не все заказы: Проверьте, правильно ли указаны статусы в массиве
post_status. WooCommerce использует префиксwc-перед статусом. - Удаление не полное (оставляются метаданные): Использование
wp_delete_post($order_id, true)гарантирует полное удаление, включая метаданные. - Ошибка прав доступа при ручном запуске: Убедитесь, что вызов функции ограничен проверкой права
manage_options.
Практические советы по безопасности и производительности
- Не запускайте удаление заказов чаще, чем раз в сутки, чтобы минимизировать нагрузку на базу.
- Резервное копирование базы перед активацией скрипта — обязательное условие, особенно на живом сайте.
- Если заказов очень много, разбивайте удаление на пакеты по 100-200 заказов за один запуск, чтобы избежать таймаутов.
- Для контроля состояния Cron используйте плагин WP Crontrol (https://wordpress.org/plugins/wp-crontrol/).
Сравнение способов удаления старых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WooCommerce Bulk Delete) | Простота, интерфейс, настройки без кода | Зависимость от стороннего кода, иногда перегрузка базы |
| Ручное удаление через админку | Контроль, без риска ошибок скриптов | Долго, неудобно для большого количества заказов |
| Автоматизированный скрипт WP-Cron (как в статье) | Полный контроль, гибкость, без лишних плагинов | Требует базовых знаний PHP, настройка Cron |