Диагностика проблемы: зачем удалять старые заказы в WooCommerce
Магазины на WooCommerce со временем накапливают большое количество заказов с разными статусами. Отменённые и завершённые заказы, которые давно не актуальны, занимают место в базе данных, замедляют запросы и делают резервное копирование более тяжёлым. Стандартных инструментов для автоматического удаления старых заказов WooCommerce не предоставляет, и большинство решений — сторонние плагины, которые могут влиять на производительность.
Часто администраторы сталкиваются с задачей автоматизировать очистку базы заказов по дате и статусу без использования плагинов. В статье рассмотрим, как это реализовать через кастомный код с использованием WP-Cron и WooCommerce API.
Как настроить автоматическое удаление заказов по дате и статусу
1. Определяем критерии удаления
В нашем случае нужно удалять заказы со статусом cancelled и completed, которые старше определённого количества дней, например, 90 дней.
2. Создаём функцию удаления заказов
Ниже пример функции для удаления заказов с нужным статусом и датой:
function wpcore_delete_old_orders() {
$statuses = array('cancelled', 'completed');
$days_limit = 90;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_limit} days"));
foreach ($statuses as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'posts_per_page' => 100, // Пакет по 100 заказов за раз
'fields' => 'ids',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
wp_reset_postdata();
}
}
3. Настраиваем WP-Cron для регулярного запуска
Чтобы функция запускалась регулярно, добавим событие в WP-Cron:
if (! wp_next_scheduled('wpcore_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpcore_daily_delete_old_orders');
}
add_action('wpcore_daily_delete_old_orders', 'wpcore_delete_old_orders');
Проверка результата после внедрения
- Проверить в базе данных, что заказы со статусом
cancelledиcompleted, старше 90 дней, удалены. - В админке WooCommerce убедиться, что количество заказов уменьшилось.
- Для проверки запуска Cron можно временно изменить расписание на
hourlyи посмотреть логи ошибок или добавить запись в лог внутри функции.
Частые ошибки и их исправление
- Функция не запускается: убедитесь, что WP-Cron работает (например, посетите сайт, чтобы запустить Cron) или настройте системный cron для wp-cron.php.
- Заказы не удаляются: проверьте правильность статусов и даты в
WP_Query. Статусы должны начинаться сwc-. - Удаление не полное: параметр
wp_delete_post($order_id, true)отвечает за полное удаление без перемещения в корзину. - Большая нагрузка при удалении: используйте
posts_per_pageдля пакетного удаления и избегайте удаления всех заказов за раз.
Практические советы по безопасности и производительности
- Резервное копирование базы перед внедрением автоматического удаления.
- Используйте транзакции или дополнительные проверки, если база многоуровневая и связи сложные.
- Выводите логи удаления в отдельный файл для аудита и отладки.
- Для сайтов с большим количеством заказов стоит запускать удаление поэтапно, например, через WP-CLI или внешние cron-задачи.
- Если необходимо, интегрируйте проверку прав пользователя, чтобы функция не запускалась случайно в пользовательском режиме.
Сравнение подходов: плагин vs код vs компромиссы
| Подход | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Плагин (например, WooCommerce Remove Old Orders) | Готовое решение, настройки в админке, поддержка | Дополнительная нагрузка, возможные конфликты, ограниченная кастомизация | Для простых сайтов или без разработчика |
| Кастомный код + WP-Cron | Лёгкость, контроль, отсутствие сторонних зависимостей | Нужно тестировать, требует знаний, риски при ошибках | Для опытных разработчиков и крупных проектов |
| Компромисс (код + WP-CLI) | Максимальная производительность и контроль | Требует SSH доступа и навыков работы с командной строкой | Для больших магазинов и продвинутых админов |