Проблема: накопление неактивных заказов и замедление базы данных
WooCommerce не предоставляет встроенных средств для удаления заказов по статусу и дате, что приводит к росту базы данных и снижению производительности. Например, отменённые или отложенные заказы могут храниться месяцами, занимая место и замедляя запросы.
Диагностика проблемы
Для начала определите, сколько заказов определённых статусов и возраста сейчас хранится в базе. Запустите SQL-запрос на базе данных WordPress:
SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Затем проверьте дату создания заказов с нужным статусом:
SELECT ID, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' ORDER BY post_date ASC LIMIT 10;Это поможет понять, как много старых заказов нужно удалить.
Решение: PHP-скрипт для автоматического удаления заказов
Оптимальный способ — создать функцию, которая будет запускаться через WP-Cron и удалять заказы по заданным условиям. Ниже пример кода для удаления заказов со статусом wc-cancelled, созданных более 30 дней назад.
Код для functions.php или отдельного плагина
function wpstudy_delete_old_cancelled_orders() {
$days = 30; // Кол-во дней для хранения заказов
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'date_query' => [
[
'before' => $date,
'inclusive' => true,
],
],
'posts_per_page' => 50,
'fields' => 'ids',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // Принудительное удаление
}
}
}
// Регистрируем событие WP-Cron
if (!wp_next_scheduled('wpstudy_delete_old_cancelled_orders_event')) {
wp_schedule_event(time(), 'daily', 'wpstudy_delete_old_cancelled_orders_event');
}
// Хук для запуска функции
add_action('wpstudy_delete_old_cancelled_orders_event', 'wpstudy_delete_old_cancelled_orders');Объяснение
- Функция ищет заказы со статусом
wc-cancelled, старше 30 дней. - Удаление происходит пакетами по 50 заказов за раз — это предотвращает перегрузку сервера.
- WP-Cron запускает функцию ежедневно.
Проверка результата
После активации кода:
- Проверьте таблицу
wp_postsв базе данных на наличие заказов со статусомwc-cancelledстарше 30 дней — их должно не остаться. - В админке WooCommerce проверьте список заказов с отменённым статусом — старые должны исчезнуть.
- Для тестирования можно временно уменьшить
$daysдо 1 и создать тестовые заказы с нужным статусом и датой.
Частые ошибки и как их исправить
- WP-Cron не запускается: по умолчанию WP-Cron срабатывает при посещении сайта. Если на сайте мало трафика, добавьте системный cron, который вызывает
wp-cron.phpраз в час. - Удаление не происходит: проверьте, что функция подключена и событие зарегистрировано. Включите логирование ошибок PHP.
- Удаляются не те заказы: перепроверьте статус в запросе
'post_status' => 'wc-cancelled'— статус должен соответствовать нужному. - Перегрузка сервера: уменьшите
posts_per_pageс 50 до 10, чтобы снизить нагрузку.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($order_id, true)для полного удаления, включая метаданные. Но если требуется архивация, используйте флагfalse. - Для больших магазинов с сотнями тысяч заказов лучше запускать удаление по частям с ограничениями по времени, чтобы избежать таймаутов.
- Настройте мониторинг WP-Cron с помощью плагинов типа WP Crontrol, чтобы видеть и управлять задачами.
- Резервное копирование базы перед массовым удалением — обязательное условие.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Простота, не требует кода | Трудоёмко, невозможно автоматизировать |
| SQL-запросы напрямую в базе | Быстрое удаление большого объёма | Риск повредить данные, требует опыта |
| PHP-скрипт с WP-Cron (как в статье) | Автоматизация, безопасное удаление, можно настроить | Требует базовых знаний PHP, настройка cron |