Диагностика проблемы: зачем удалять старые заказы в WooCommerce
Магазины на WooCommerce часто накапливают тысячи заказов, включая отменённые, просроченные и неоплаченные. Это замедляет работу базы данных и усложняет администрирование. Удаление старых заказов, которые не имеют коммерческой ценности, помогает поддерживать базу в чистоте и повышает производительность.
Как определить, какие заказы подлежат удалению
Чаще всего удаляют заказы со статусом cancelled, failed и pending, которые старше определённого времени (например, 30 дней). Важно не трогать завершённые (completed) и обрабатываемые (processing) заказы.
Пример запроса для проверки кандидатов на удаление
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-pending') AND post_date < NOW() - INTERVAL 30 DAY;Этот SQL-запрос показывает, какие заказы можно удалить без риска потерять важные данные.
Пошаговое решение: автоматизация удаления заказов по таймауту
1. Создание функции для удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wpkey_delete_old_woocommerce_orders() {
$days = 30; // Время хранения заказов в днях
$statuses_to_delete = [
'wc-cancelled',
'wc-failed',
'wc-pending'
];
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'shop_order',
'post_status' => $statuses_to_delete,
'date_query' => [
[
'before' => $date_threshold,
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$old_orders = get_posts($args);
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true); // true - удаляет без перемещения в корзину
}
}2. Автоматический запуск через WP-Cron
Чтобы функция запускалась регулярно, добавим задачу WP-Cron:
if (!wp_next_scheduled('wpkey_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpkey_daily_delete_old_orders');
}
add_action('wpkey_daily_delete_old_orders', 'wpkey_delete_old_woocommerce_orders');Этот код запускает очистку заказов один раз в сутки.
Проверка результата после внедрения
- Выполните SQL-запрос из раздела диагностики до и после запуска функции, чтобы проверить, что старые заказы удаляются.
- При необходимости временно вызовите функцию вручную, вызвав
wpkey_delete_old_woocommerce_orders()в админке через плагин Code Snippets или временный код. - Проверьте логи ошибок сервера и WooCommerce на предмет конфликтов.
Частые ошибки и их исправление
- Функция не запускается по расписанию: Убедитесь, что на сайте не отключен WP-Cron (проверьте
DISABLE_WP_CRONвwp-config.php). - Удаляются важные заказы: Проверьте, что статусы в массиве
$statuses_to_deleteуказаны корректно и не включаютwc-completedили другие важные. - Производительность падает: При большом количестве заказов разбейте удаление на части с помощью пагинации и
set_time_limit.
Практические советы по безопасности и производительности
- Всегда делайте резервное копирование базы данных перед внедрением автоматического удаления.
- Добавьте логирование удалённых заказов для контроля (например, через
error_logили отдельную таблицу). - Не удаляйте заказы сразу, если интегрированы сторонние сервисы — сначала проверьте их обработку.
- Для сайтов с большим трафиком рассмотрите использование wp-cli скриптов для запуска очистки вне WP-Cron.
- Регулярно оптимизируйте таблицы базы данных после массовых удалений.
Сравнение вариантов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-Cron + PHP (как в статье) | Автоматизация, гибкость, легко настраивается | Зависит от посещаемости сайта, может не сработать вовремя |
| wp-cli скрипт | Независим от WP-Cron, подходит для больших сайтов | Требует доступа к серверу, не для новичков |
| Плагины очистки базы | Удобный UI, дополнительные функции | Могут быть избыточны или конфликтовать с другими плагинами |