Проблема: необходимость автоматического удаления старых заказов в WooCommerce
WooCommerce не предоставляет встроенного механизма для автоматического удаления заказов по определённым критериям, например, по статусу и дате создания. Это вызывает рост базы данных и замедление работы магазина при большом количестве устаревших заказов, например, со статусом "отменён" или "в ожидании оплаты" старше определённого срока.
Диагностика проблемы
Чтобы убедиться в необходимости автоматического удаления заказов:
- Проверьте размер таблиц
wp_postsиwp_postmetaс типом записиshop_order. - Оцените количество заказов с нужным статусом, например, "cancelled" или "failed" старше 30 дней:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);Если количество большое (сотни и более), стоит задуматься об автоматическом удалении.
Решение: создание WP-Cron задачи для удаления заказов по статусу и дате
Реализуем функцию, которая будет запускаться по расписанию, искать заказы с указанным статусом и датой старше N дней, и удалять их вместе со всеми метаданными.
Шаг 1: регистрация cron задачи
add_action('wp', function() {
if (!wp_next_scheduled('custom_delete_old_orders_event')) {
wp_schedule_event(time(), 'daily', 'custom_delete_old_orders_event');
}
});Шаг 2: реализация функции удаления заказов
add_action('custom_delete_old_orders_event', function() {
global $wpdb;
$status = 'wc-cancelled'; // статус заказов для удаления
$days_old = 30; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));
// Получаем 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)) {
return;
}
foreach ($order_ids as $order_id) {
// Используем WC_Order для правильного удаления
$order = wc_get_order($order_id);
if ($order) {
wp_delete_post($order_id, true); // true - принудительное удаление без перемещения в корзину
}
}
});Шаг 3: отмена cron при деактивации плагина
register_deactivation_hook(__FILE__, function() {
$timestamp = wp_next_scheduled('custom_delete_old_orders_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'custom_delete_old_orders_event');
}
});Проверка результата после внедрения
- Выполните вручную запуск cron задачи через WP-CLI или специальный плагин для тестирования cron:
wp cron event run custom_delete_old_orders_event - Проверьте, что заказы с указанным статусом и датой удаления отсутствуют в базе:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);— должен возвращаться 0. - Отследите логи сервера и ошибок WordPress на предмет исключений.
Частые ошибки и как их исправить
- Неправильный статус заказа: В WooCommerce статусы заказов имеют префикс
wc-. Например, отменённый заказ имеет статусwc-cancelled. Без префикса запросы не найдут нужные заказы. - Удаление не всех метаданных: Используйте
wp_delete_postс параметромtrue, чтобы удалить пост и все связанные данные. Самостоятельное удаление из таблиц может привести к остаткам данных. - Cron не запускается: Убедитесь, что в системе посещений сайта есть трафик или используйте системный cron для запуска WP-Cron. Проверьте наличие задачи через WP-CLI:
wp cron event list - Удаление заказов, которые не следует трогать: Убедитесь, что фильтры по статусу и дате точно соответствуют нужным заказам, чтобы не потерять активные данные.
Практические советы по безопасности и производительности
- Запланируйте удаление на ночное время с минимальной нагрузкой.
- Если заказов очень много, обрабатывайте их партиями, например, по 50-100, чтобы не превышать лимиты PHP-скрипта.
- Логируйте удалённые ID заказов в отдельный файл для аудита.
- Регулярно делайте бэкапы базы данных перед автоматическим удалением.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
Удаление через WP-Cron и wp_delete_post | Корректное удаление всех связанных данных, легко настроить, интегрировано с WordPress | Зависит от корректной работы WP-Cron, может создавать нагрузку при больших объёмах |
| Ручное удаление через SQL-запросы | Мгновенный эффект, можно удалить сразу много заказов | Риск повредить данные, требует точных запросов, не удаляет связанные метаданные автоматически |
| Плагины автоматизации | Удобный интерфейс, дополнительные функции (логирование, фильтры) | Дополнительная нагрузка, возможные конфликты, платные версии |