Проблема: накопление старых заказов в WooCommerce и необходимость их удаления
WooCommerce по умолчанию не удаляет старые заказы, даже если они имеют статус «отменён» или «выполнен». Со временем база данных магазина растёт, что может замедлить работу сайта и усложнить администрирование. Автоматическое удаление заказов по статусу и дате помогает поддерживать чистоту базы и улучшать производительность.
Диагностика проблемы
Чтобы понять, что на вашем сайте накопилось слишком много заказов, зайдите в WooCommerce → Заказы и посмотрите общую статистику. При больших объёмах заказов (сотни тысяч) админка начинает работать медленно.
Для проверки можно использовать SQL-запрос к базе:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если в статусах wc-completed, wc-cancelled и других много старых заказов, их имеет смысл массово удалить.
Пошаговое решение: автоматизация удаления заказов по статусу и дате
1. Создаём функцию для удаления заказов
Добавьте следующий код в functions.php вашей дочерней темы или в собственный плагин:
function wc_delete_old_orders_by_status_date() {
if ( ! class_exists('WooCommerce') ) {
return; // WooCommerce не активен
}
global $wpdb;
$statuses = array('wc-cancelled', 'wc-failed', 'wc-refunded'); // Статусы для удаления
$date_threshold = date('Y-m-d H:i:s', strtotime('-90 days')); // Удалять заказы старше 90 дней
foreach ($statuses as $status) {
// Получаем ID заказов
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
$status, $date_threshold
));
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // Полное удаление заказа
}
}
}
}2. Запускаем функцию автоматически по расписанию через WP-Cron
Добавьте следующий код для регистрации крон-задачи, которая будет запускать очистку раз в сутки:
function wc_schedule_old_order_deletion() {
if ( ! wp_next_scheduled( 'wc_delete_old_orders_daily_event' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_old_orders_daily_event' );
}
}
add_action('wp', 'wc_schedule_old_order_deletion');
add_action('wc_delete_old_orders_daily_event', 'wc_delete_old_orders_by_status_date');3. По желанию: добавьте административное уведомление о выполнении задачи
Чтобы видеть отчёт о работе функции, можно добавить логирование в файл или выводить уведомления в админке. Например, логируем количество удалённых заказов в debug.log:
function wc_delete_old_orders_by_status_date() {
if ( ! class_exists('WooCommerce') ) {
return;
}
global $wpdb;
$statuses = array('wc-cancelled', 'wc-failed', 'wc-refunded');
$date_threshold = date('Y-m-d H:i:s', strtotime('-90 days'));
$deleted_count = 0;
foreach ($statuses as $status) {
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
$status, $date_threshold
));
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
if (wp_delete_post($order_id, true)) {
$deleted_count++;
}
}
}
}
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log("WooCommerce: удалено заказов по статусу и дате - {$deleted_count}");
}
}Проверка результата после внедрения
- Вручную запустите функцию из админки (через WP-CLI или временно вызовите напрямую) и проверьте в базе, что заказы старше 90 дней с указанными статусами удалились.
- Проверьте логи debug.log на наличие строки с количеством удалённых заказов.
- Убедитесь, что в разделе «Заказы» в админке количество заказов с выбранными статусами уменьшилось.
- Через сутки проверьте, что WP-Cron сработал и удаление прошло автоматически.
Частые ошибки и как их исправить
- Функция не запускается: Проверьте, что WooCommerce активен, и что хук WP-Cron зарегистрирован (wp_schedule_event). Можно использовать плагин WP Crontrol для диагностики.
- Заказы не удаляются: Убедитесь, что статусы указаны правильно — в WooCommerce статусы заказов начинаются с
wc-, например,wc-cancelled. - Удаляются не те заказы: Проверьте условие даты и статус. Можно временно вывести IDs заказов перед удалением для проверки.
- Проблемы с производительностью при удалении большого количества заказов: Делайте удаление партиями, например, ограничьте количество заказов на итерацию, чтобы избежать тайм-аутов.
Практические советы по безопасности и производительности
- Добавьте nonce и проверку прав, если вызываете функцию через AJAX или вручную из админки.
- Перед удалением сделайте резервную копию базы данных.
- Ограничьте удаление заказов пакетами (например, по 50 заказов за раз), чтобы избежать перегрузки сервера:
function wc_delete_old_orders_by_status_date_batch() {
global $wpdb;
$statuses = array('wc-cancelled', 'wc-failed', 'wc-refunded');
$date_threshold = date('Y-m-d H:i:s', strtotime('-90 days'));
$batch_size = 50;
foreach ($statuses as $status) {
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s LIMIT %d",
$status, $date_threshold, $batch_size
));
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true);
}
}
}
}- Для контроля используйте плагин Clearfy Pro, который содержит инструменты для оптимизации базы данных WooCommerce.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное удаление в админке | Просто, не требует кода | Трудоёмко при большом количестве заказов | Малые объёмы |
| SQL-запросы напрямую в базе | Быстро, массово | Риск повредить данные, нет учёта связей | Опытным администраторам |
| Автоматизация через PHP и WP-Cron (код) | Безопасно, гибко, автоматическое выполнение | Требует базовых навыков программирования | Средние и большие магазины |
| Использование плагинов (например, Clearfy Pro) | Удобно, дополнительные функции оптимизации | Платные решения, нагрузка на сайт | Все уровни |