Диагностика проблемы с накоплением старых заказов в WooCommerce
Магазины на WooCommerce часто сталкиваются с проблемой накопления большого количества заказов со статусами «отменён», «неоплачен» или «обработан». Это приводит к раздутию базы данных, замедлению админ-панели и неоптимальной работе сайта. Решение — автоматическое удаление заказов по определённым условиям (статусу и времени нахождения в этом статусе).
Чтобы понять, насколько актуальна эта проблема, проверьте количество заказов с нужными статусами в базе данных. Для этого можно выполнить SQL-запрос через phpMyAdmin или WP-CLI:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если количество заказов с статусом wc-cancelled или wc-pending исчисляется тысячами — пора автоматизировать их удаление.
Пошаговое решение: создание автоматического удаления старых заказов по статусу
1. Создание функции удаления заказов
Добавьте следующий код в файл functions.php вашей активной темы или в кастомный плагин:
function wpcoder_delete_old_orders() {
$statuses_to_delete = array('wc-cancelled', 'wc-pending'); // Статусы для удаления
$days = 30; // Возраст заказа в днях
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
foreach ($statuses_to_delete as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => $status,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
}
}2. Настройка wp-cron для регулярного запуска
Чтобы функция выполнялась автоматически, создадим хук и регистрируем задачу в WP-Cron:
if (!wp_next_scheduled('wpcoder_daily_delete_orders')) {
wp_schedule_event(time(), 'daily', 'wpcoder_daily_delete_orders');
}
add_action('wpcoder_daily_delete_orders', 'wpcoder_delete_old_orders');Этот код запускает очистку один раз в сутки. Вы можете изменить периодичность на 'twicedaily' или 'hourly', если нужно.
3. Проверка работы функции вручную
Для немедленной проверки добавьте временный вызов функции (удалите после теста):
add_action('admin_init', function() {
if (!current_user_can('manage_options')) return;
wpcoder_delete_old_orders();
});После захода в админку заказы, подходящие под условия, должны быть удалены.
Как проверить, что удаление сработало
- Перейдите в WooCommerce → Заказы и проверьте количество заказов с нужными статусами, они должны уменьшиться или исчезнуть.
- Можно проверить через SQL-запрос (см. раздел диагностики), количество удалённых заказов должно сократиться.
- Посмотрите логи сайта (если включены), ошибок при удалении не должно быть.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что статус заказа указан с префиксом
wc-. Например,wc-cancelled, а не простоcancelled. - Функция не запускается по расписанию: Убедитесь, что WP-Cron работает корректно (например, при слабом трафике cron-задачи могут не запускаться). Для теста используйте плагин WP Crontrol или запускайте cron вручную.
- Удаление слишком агрессивное: Проверьте переменную
$days, увеличьте количество дней, чтобы не удалять свежие заказы. - Проблемы с правами: Убедитесь, что функция запускается с правами администратора, чтобы избежать ограничений.
Практические советы по безопасности и производительности
- Используйте полный
wp_delete_post($order_id, true)для удаления заказов из базы, чтобы не оставлять «мусор». - Если заказов очень много, разбивайте удаление на части, чтобы избежать таймаутов. Например, в функции добавить ограничение
posts_per_page => 100и запускать несколько раз. - Резервное копирование базы перед внедрением автоматического удаления — обязательное условие.
- Для производительности — отключайте WP-Cron и настраивайте системный cron на сервере, чтобы задачи запускались стабильно.
Сравнение ручного и автоматического удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, риск пропустить старые заказы |
| Автоматизация через код + WP-Cron | Экономит время, регулярно чистит базу | Требует настройки, возможны ошибки при некорректном коде |
| Плагины очистки заказов | Готовые решения с UI | Могут замедлять сайт, лишние зависимости |