Диагностика проблемы с отменёнными заказами в WooCommerce
При активном интернет-магазине на WooCommerce база данных быстро заполняется заказами в разных статусах. Заказы со статусом cancelled (отменённые) зачастую не несут ценности для аналитики и могут замедлять работу сайта, особенно при большом объёме данных. Если вы заметили, что в админке WooCommerce много отменённых заказов или база начинает расти, пора автоматизировать их удаление.
Проверить количество отменённых заказов можно через SQL-запрос к базе данных или в админке WooCommerce:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';Если число велико (сотни и выше), это повод для оптимизации.
Пошаговое решение: автоматическое удаление отменённых заказов через WP-Cron
1. Создание функции для удаления заказов
Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код, который удалит отменённые заказы старше 7 дней:
function wp0_delete_old_cancelled_orders() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-7 days'));
// Получаем ID заказов wc-cancelled старше 7 дней
$orders_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
$date_threshold
));
if (empty($orders_to_delete)) {
return;
}
foreach ($orders_to_delete as $order_id) {
wp_delete_post($order_id, true); // true - удаление без перемещения в корзину
}
}2. Регистрация периодического события WP-Cron
Добавим хук, который будет запускать функцию ежедневно:
function wp0_schedule_cancelled_orders_cleanup() {
if (!wp_next_scheduled('wp0_daily_cancelled_orders_cleanup')) {
wp_schedule_event(time(), 'daily', 'wp0_daily_cancelled_orders_cleanup');
}
}
add_action('wp', 'wp0_schedule_cancelled_orders_cleanup');
add_action('wp0_daily_cancelled_orders_cleanup', 'wp0_delete_old_cancelled_orders');3. Очистка при деактивации темы или плагина
Чтобы избежать мусора в WP-Cron, удалим расписание при деактивации:
function wp0_clear_cancelled_orders_cleanup_schedule() {
$timestamp = wp_next_scheduled('wp0_daily_cancelled_orders_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wp0_daily_cancelled_orders_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wp0_clear_cancelled_orders_cleanup_schedule');Проверка результата после внедрения
- Перед запуском проверьте количество отменённых заказов через SQL или в WooCommerce.
- Запустите функцию вручную, вызвав
wp0_delete_old_cancelled_orders()через консоль WP-CLI или временно добавьте вызов в код для теста. - Проверьте, что отменённые заказы старше 7 дней исчезли.
- Наблюдайте через день – должна включиться автоматическая очистка.
Частые ошибки и как их исправить
- Функция не запускается автоматически: Убедитесь, что WP-Cron работает (например, посетите сайт – это запускает cron). Для проверки можно установить плагин Query Monitor и посмотреть cron-события.
- Удаляются не те заказы: Проверьте правильность статуса
wc-cancelledи условий даты. - Проблемы с правами доступа к базе: Убедитесь, что пользователь базы данных имеет права на удаление записей.
- Накопление мета-данных: wp_delete_post() удаляет мета, но если используете сторонние плагины – проверьте, нет ли лишних данных.
Практические советы по производительности и безопасности
- Не удаляйте заказы слишком быстро – оставляйте запас времени (7 дней и более), чтобы не потерять полезные данные.
- Используйте WP-CLI для массовой очистки при больших объёмах данных, чтобы избежать таймаутов.
- Резервное копирование базы перед автоматическим удалением обязательно.
- Оптимизируйте базу после удаления – командой SQL
OPTIMIZE TABLE wp_posts;или с помощью плагинов.
Сравнение способов автоматической очистки отменённых заказов
| Способ | Плюсы | Минусы |
|---|---|---|
| WP-Cron с функцией удаления | Автоматизация, гибкость, не требует сторонних плагинов | Зависит от посещаемости сайта, возможны задержки |
| Плагин для очистки заказов | Простота настройки, дополнительные функции | Дополнительная нагрузка, возможные конфликты |
| Ручной SQL-запрос | Мгновенный эффект, полный контроль | Риск ошибок, требует технических знаний |