Диагностика проблемы с накоплением старых заказов в WooCommerce
На больших магазинах WooCommerce количество заказов со временем растет в геометрической прогрессии. Это приводит к разрастанию базы данных и замедлению админки, особенно на страницах с заказами. Если не очищать старые, завершённые или отменённые заказы, производительность падает, а бэкапы и миграции становятся тяжелее.
Проверить количество заказов можно так:
SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если в таблице wp_posts тысячи заказов со статусами completed, cancelled или refunded старше 1 года — пора подумать об автоматической очистке.
Как настроить автоматическое удаление старых заказов: пошаговое решение
1. Создаём функцию для удаления заказов по дате и статусу
Добавьте следующий код в файл functions.php вашей дочерней темы или создайте маленький плагин для удобства:
function wpmonitor_delete_old_orders() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-1 year'));
// Получаем ID заказов со статусом completed, cancelled, refunded старше года
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-cancelled', 'wc-refunded') AND post_date < %s",
$date_threshold
));
if (empty($order_ids)) {
return;
}
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // true - удаляем безвозвратно
}
}2. Автоматизируем запуск через WP-Cron
Чтобы функция запускалась регулярно, добавим задачу cron:
// Регистрируем задачу при инициализации
add_action('wpmonitor_delete_old_orders_cron', 'wpmonitor_delete_old_orders');
function wpmonitor_activate_cron() {
if (!wp_next_scheduled('wpmonitor_delete_old_orders_cron')) {
wp_schedule_event(time(), 'daily', 'wpmonitor_delete_old_orders_cron');
}
}
add_action('wp', 'wpmonitor_activate_cron');
// Для деактивации крон-события
function wpmonitor_deactivate_cron() {
$timestamp = wp_next_scheduled('wpmonitor_delete_old_orders_cron');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpmonitor_delete_old_orders_cron');
}
}
register_deactivation_hook(__FILE__, 'wpmonitor_deactivate_cron');Проверка результата после внедрения
После добавления кода подождите до следующего запуска cron (обычно раз в сутки). Затем выполните в базе тот же SQL-запрос, чтобы убедиться, что количество заказов со статусом completed, cancelled, refunded старше года уменьшилось.
Также проверьте админку WooCommerce > Заказы — старые заказы должны исчезнуть.
Частые ошибки и как их исправить
- Ошибка: Код не удаляет заказы.
Причина: Неверные статусы заказов. WooCommerce хранит статусы с префиксомwc-, например,wc-completed, а не простоcompleted. Проверьте, что в SQL и запросах используются правильные статусы. - Ошибка: WP-Cron не запускается.
Причина: На сайте низкий трафик, cron срабатывает только при визите. Для теста запустите cron вручную плагином WP Crontrol или через wp-cli. - Ошибка: Заказы удаляются не полностью.
Причина: Использовалсяwp_trash_postвместоwp_delete_post($id, true). Второй параметр true гарантирует полное удаление без помещения в корзину.
Практические советы по безопасности и производительности
- Резервное копирование: Перед автоматическим удалением сделайте резервную копию базы данных.
- Пакетное удаление: Если заказов очень много, удаляйте порциями по 100-200 штук, чтобы избежать таймаутов и нагрузок.
- Логирование: Добавьте логирование ID удалённых заказов в отдельный файл для аудита.
- WP-CLI: Для больших магазинов лучше запускать очистку заказов через wp-cli, где можно контролировать процесс и видеть прогресс.
Сравнение способов автоматизации удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + кастомный код | Гибкость, бесплатное решение, можно адаптировать под требования | Нужен трафик для запуска, может быть медленным при большом объёме |
| Плагин типа WP Bulk Delete | Удобный интерфейс, можно удалять разные типы контента | Дополнительная нагрузка, иногда ограничена функциональность |
| WP-CLI скрипт | Высокая скорость, можно запускать вручную или по cron на сервере | Требует доступа к серверу, знания командной строки |