Диагностика проблемы с накоплением заказов в WooCommerce
В магазинах на WooCommerce с течением времени накапливаются заказы со статусами «отменён» и «завершён». Это увеличивает размер базы данных, замедляет работу административной панели и усложняет управление заказами. Особенно проблематично, когда старые заказы уже не нужны для аналитики или отчетности.
Проверить проблему можно через phpMyAdmin или админку WordPress: в разделе WooCommerce → Заказы отфильтровать по статусам «cancelled» и «completed» и посмотреть их количество. Если их тысячи, стоит автоматизировать очистку.
Пошаговое решение: автоматическое удаление заказов по расписанию через WP-Cron
1. Создание функции удаления заказов по статусам
Добавьте следующий код в файл темы functions.php или в отдельный плагин:
function wpnews_delete_old_wc_orders() {
if ( ! class_exists('WC_Order_Query') ) {
return;
}
// Определяем дату, за которую удаляем заказы (например, старше 30 дней)
$date_before = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = array(
'limit' => -1,
'status' => array('cancelled', 'completed'),
'date_created' => '<' . $date_before,
'return' => 'ids',
);
$query = new WC_Order_Query( $args );
$order_ids = $query->get_orders();
if ( empty($order_ids) ) {
return;
}
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true ); // true - принудительное удаление без корзины
}
}
2. Регистрация WP-Cron задачи для запуска очистки
Добавьте в functions.php следующий код для создания хука и расписания:
// Регистрируем событие при активации темы/плагина
function wpnews_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpnews_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpnews_daily_order_cleanup' );
}
}
add_action( 'wp', 'wpnews_schedule_order_cleanup' );
// Обработчик события
add_action( 'wpnews_daily_order_cleanup', 'wpnews_delete_old_wc_orders' );
// Очистка расписания при деактивации темы/плагина
function wpnews_unschedule_order_cleanup() {
$timestamp = wp_next_scheduled( 'wpnews_daily_order_cleanup' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpnews_daily_order_cleanup' );
}
}
// Вызовите эту функцию при деактивации плагина или темы
3. Ручной запуск для проверки
Для проверки работоспособности кода можно вызвать функцию напрямую из админки, например, добавив временный админ-экшен:
add_action('admin_post_wpnews_manual_order_cleanup', function() {
if ( current_user_can('manage_woocommerce') ) {
wpnews_delete_old_wc_orders();
wp_redirect(admin_url('edit.php?post_type=shop_order&wpnews_cleanup=done'));
exit;
}
});
И ссылка для запуска вручную (временно): https://example.com/wp-admin/admin-post.php?action=wpnews_manual_order_cleanup
Проверка результата после внедрения
- Перейдите в WooCommerce → Заказы, отфильтруйте по статусам «отменён» и «завершён».
- Сравните количество заказов старше 30 дней до и после запуска функции.
- Можно проверить таблицу
wp_postsс типомshop_orderи датой публикации (<= 30 дней назад). - Если запускаете cron вручную, убедитесь, что редирект с параметром
wpnews_cleanup=doneсрабатывает.
Частые ошибки и способы их исправления
- WP-Cron не срабатывает: проверьте, вызывается ли cron по расписанию. Если нет, настройте системный cron на вызов
wp-cron.phpили используйте плагин WP Crontrol для диагностики. - Функция не удаляет заказы: убедитесь, что статус заказа указан корректно (cancelled, completed), и что есть заказы старше 30 дней.
- Удаление не происходит из-за прав: функция
wp_delete_postтребует права администратора; вызов должен быть из контекста с нужными правами. - Заказы не удаляются полностью: параметр
trueво втором аргументеwp_delete_postобязателен для полного удаления без корзины.
Практические советы по безопасности и производительности
- Добавляйте логирование действий удаления для аудита и отладки (например, в файл или через error_log).
- Ограничивайте количество удаляемых заказов за один вызов, чтобы избежать таймаутов и нагрузок (в примере limit = -1, можно заменить на 100 и запускать несколько раз).
- Защищайте ручной запуск функции через проверку capability и nonce, чтобы избежать несанкционированного вызова.
- Регулярно делайте резервные копии базы данных перед автоматическими очистками.
- Если база очень большая, рассмотрите удаление заказов через SQL-запросы с осторожностью, но предпочтительнее использовать WC_Order_Query для корректного удаления связанных данных.
Сравнение способов автоматического удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с WC_Order_Query и wp_delete_post | Корректное удаление заказов и связанных метаданных, безопасно | Требует правильной настройки WP-Cron, может быть медленным при большом объёме |
| SQL-запросы напрямую в БД | Быстрое удаление большого количества заказов | Риск нарушения целостности данных, требует глубокого понимания структуры БД |
| Плагины для очистки заказов (например, Advanced Database Cleaner) | Удобный интерфейс, автоматизация | Зависимость от сторонних решений, может не покрывать все сценарии |