Диагностика проблемы: зачем и когда удалять старые заказы в WooCommerce
С течением времени база данных WooCommerce накапливает большое количество заказов, включая отменённые и завершённые. Это приводит к росту размера базы, замедлению работы административной панели и нагрузке на сервер. Особенно актуально для магазинов с большим объемом продаж.
Удаление старых заказов помогает оптимизировать базу данных, улучшить производительность и уменьшить размер бэкапов.
Пошаговое решение: автоматическое удаление заказов по расписанию с помощью WP-Cron
1. Определяем критерии для удаления заказов
Для удаления обычно выбирают статусы заказов, например:
completed— завершённые;cancelled— отменённые;failed— неудачные;
Также задаём возраст заказа, например, старше 90 дней.
2. Создаём функцию для удаления
Добавьте следующий код в functions.php вашей дочерней темы или в кастомный плагин:
function wpmart_delete_old_orders() {
$days = 90; // количество дней
$statuses = array('completed', 'cancelled', 'failed');
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
foreach ($statuses as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - без перемещения в корзину
}
}
}
}3. Регистрируем задачу WP-Cron для запуска удаления раз в сутки
function wpmart_schedule_order_deletion() {
if (!wp_next_scheduled('wpmart_daily_order_deletion')) {
wp_schedule_event(time(), 'daily', 'wpmart_daily_order_deletion');
}
}
add_action('wp', 'wpmart_schedule_order_deletion');
add_action('wpmart_daily_order_deletion', 'wpmart_delete_old_orders');4. Очистка расписания при деактивации
function wpmart_remove_order_deletion_schedule() {
$timestamp = wp_next_scheduled('wpmart_daily_order_deletion');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpmart_daily_order_deletion');
}
}
register_deactivation_hook(__FILE__, 'wpmart_remove_order_deletion_schedule');Проверка результата после внедрения
- Проверьте наличие запланированного события через плагин WP Crontrol или вызовом
wp_next_scheduled('wpmart_daily_order_deletion'). - Запустите функцию вручную (например, вызвав
wpmart_delete_old_orders()через консоль или временный хук) и убедитесь, что заказы со статусами и старше 90 дней удаляются. - Проверьте таблицу
wp_postsв базе данных, что записи заказов исчезают. - В админке WooCommerce проверьте, что старые заказы отсутствуют.
Частые ошибки и как исправить
- Заказы не удаляются: проверьте права пользователя, от которого выполняется код, он должен иметь права администратора.
- Задача WP-Cron не запускается: если сайт мало посещаемый, WP-Cron может не срабатывать. Рекомендуется настроить системный cron и отключить WP-Cron.
- Удаляются не те заказы: проверьте параметры
post_statusиdate_queryв запросе. - Повышенная нагрузка при удалении: если заказов много, лучше делать удаление порциями, например, по 50 штук за один запуск.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед активацией автоматического удаления.
- Ограничьте права доступа к функциям удаления — не давайте запускать их через публичные хуки.
- Для больших магазинов используйте пакетное удаление с пагинацией, чтобы избежать таймаутов.
- Рассмотрите использование WP-CLI для ручного удаления больших объемов заказов, если cron не подходит.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, без кода | Трудоёмко, невозможно автоматизировать |
| Плагины для удаления заказов | Удобный интерфейс, дополнительные настройки | Дополнительная нагрузка, риск конфликтов |
| Код на WP-Cron (этот способ) | Полный контроль, без лишних плагинов, гибкость | Требует базовых знаний PHP и WordPress, настройка cron |