Диагностика проблемы: зачем удалять закрытые заказы в WooCommerce
С ростом интернет-магазина база данных WooCommerce может значительно увеличиваться, что приводит к замедлению работы сайта и увеличению времени резервного копирования. Чаще всего в таблице wp_posts накапливаются заказы с статусом completed или cancelled, которые уже не нужны для оперативной работы и аналитики.
Если вы не используете сторонние CRM или отчёты, а просто хотите поддерживать базу данных в чистоте, автоматическое удаление закрытых заказов — эффективное решение.
Как определить, что заказы можно удалять
- Статус заказа —
completed,cancelled,refundedи др. - Возраст заказа — например, старше 30 или 90 дней
- Отсутствие связанных активных подписок или возвратов
Рекомендуется сначала протестировать на тестовом сайте и сделать резервную копию.
Пошаговое решение: автоматическое удаление закрытых заказов через WP-Cron
1. Создание функции для удаления заказов
function wpmonitor_delete_old_closed_orders() {
$days = 30; // количество дней хранения заказов
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-completed', 'wc-cancelled', 'wc-refunded'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // true — удалить без возможности восстановления
}
}
}2. Регистрация WP-Cron задачи для еженедельного запуска
function wpmonitor_schedule_order_cleanup() {
if (!wp_next_scheduled('wpmonitor_weekly_order_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpmonitor_weekly_order_cleanup');
}
}
add_action('wp', 'wpmonitor_schedule_order_cleanup');
add_action('wpmonitor_weekly_order_cleanup', 'wpmonitor_delete_old_closed_orders');3. Очистка WP-Cron при деактивации плагина или темы
function wpmonitor_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpmonitor_weekly_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpmonitor_weekly_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpmonitor_clear_order_cleanup_schedule');Проверка результата после внедрения
- Выполните функцию вручную, вызвав
wpmonitor_delete_old_closed_orders()из админки или консоли WP-CLI. - Проверьте таблицу
wp_posts, убедитесь, что старые заказы удалены. - Проверьте логи ошибок и работы WP-Cron (например, с помощью плагина WP Crontrol).
- Наблюдайте за уменьшением размера базы данных и ускорением резервного копирования.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что у вас есть права на удаление, и что функция действительно вызывается (добавьте логи или
error_log). - Удаление заказов с активными подписками: убедитесь, что фильтр статусов и дата выбраны правильно, чтобы не удалить нужные данные.
- WP-Cron не запускается: если на хостинге отключён WP-Cron, используйте системный cron для имитации вызова
wp-cron.php. - Потеря данных: всегда делайте бэкап перед удалением данных!
Практические советы по безопасности и производительности
- Удаляйте заказы с помощью
wp_delete_postс параметромtrueдля полного удаления, чтобы не оставлять «мусор» в базе. - Не запускайте удаление слишком часто — достаточно одного раза в неделю или месяц.
- Используйте WP-CLI для отладки и запуска задач вручную:
wp eval 'wpmonitor_delete_old_closed_orders();' - Для крупных магазинов рассмотрите пакетное удаление (например, по 100 заказов за один запуск), чтобы снизить нагрузку на базу.
Таблица сравнения вариантов удаления закрытых заказов
| Способ | Простота | Гибкость | Риски | Примечания |
|---|---|---|---|---|
| Плагин очистки базы (например, WP-Optimize) | Высокая | Средняя | Могут удалить лишнее | Удобно для неразработчиков |
| Код с WP-Cron (как в статье) | Средняя | Высокая | Требует тестирования | Контроль и настройка под проект |
| Ручное удаление через админку | Низкая | Низкая | Трудоёмко при большом объёме | Подходит для разовых очищений |