Диагностика проблемы: зачем и когда удалять заказы в WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливаются заказы разных статусов. Отменённые и неактивные заказы (например, «отменён», «ожидает оплаты» на длительный срок) занимают место в базе данных, замедляют отчёты и могут создавать путаницу при управлении. Автоматическое удаление таких заказов помогает поддерживать базу в чистоте и улучшить производительность сайта.
Пошаговое решение: автоматическое удаление заказов по статусам с помощью WP-CLI и планировщика задач
1. Создание PHP-функции для удаления заказов по статусу
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpreboot_delete_orders_by_status($statuses = array('cancelled', 'failed'), $days_old = 30) {
if (!class_exists('WooCommerce')) {
return;
}
$date_query = array(
'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
'inclusive' => true
);
$args = array(
'limit' => -1,
'status' => $statuses,
'date_created' => $date_query,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление заказа
}
}2. Создание WP-CLI команды для ручного запуска
Добавьте в плагин или functions.php следующий код, чтобы создать консольную команду:
if (defined('WP_CLI') && WP_CLI) {
WP_CLI::add_command('wpreboot delete_old_orders', function($args, $assoc_args) {
$statuses = isset($assoc_args['statuses']) ? explode(',', $assoc_args['statuses']) : array('cancelled', 'failed');
$days_old = isset($assoc_args['days']) ? intval($assoc_args['days']) : 30;
wpreboot_delete_orders_by_status($statuses, $days_old);
WP_CLI::success("Orders with statuses (" . implode(', ', $statuses) . ") older than {$days_old} days deleted.");
});
}3. Автоматизация с помощью WP Cron
Добавьте планировщик задач, который будет запускать удаление автоматически, например, раз в неделю:
function wpreboot_schedule_order_cleanup() {
if (!wp_next_scheduled('wpreboot_cleanup_old_orders_hook')) {
wp_schedule_event(time(), 'weekly', 'wpreboot_cleanup_old_orders_hook');
}
}
add_action('wp', 'wpreboot_schedule_order_cleanup');
add_action('wpreboot_cleanup_old_orders_hook', function () {
wpreboot_delete_orders_by_status(array('cancelled', 'failed'), 30);
});Проверка результата после внедрения
Для проверки работы решения:
- Запустите WP-CLI команду вручную:
wp wpreboot delete_old_orders --statuses=cancelled,failed --days=30 - В админке WooCommerce проверьте, что заказы со статусами «отменён» и «неудачный», созданные более 30 дней назад, удалены.
- Через неделю проверьте логи cron, чтобы убедиться, что запланированное задание сработало.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что WooCommerce активен и корректно загружен. Функция
wc_get_ordersдолжна возвращать заказы. - WP-CLI команда не распознаётся: Убедитесь, что WP-CLI установлен и вы используете правильный контекст (корневая папка WordPress).
- Планировщик задач не запускается: Проверьте, что cron в WordPress активен и нет конфликтов с плагинами, отключающими WP Cron.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Удаляйте заказы только старше разумного порога (например, 30 дней), чтобы не потерять актуальные данные.
- Если в магазине много заказов, выполняйте удаление партиями, чтобы избежать таймаутов серверных скриптов.
- Для больших магазинов рассмотрите использование WP-CLI для пакетной очистки, а не автоматический cron на фронтенде.
Сравнение вариантов автоматического удаления заказов
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| PHP-код с WP Cron | Автоматизация без внешних инструментов, гибкость настройки | Зависит от трафика сайта, возможны пропуски cron | Небольшие и средние магазины с умеренным трафиком |
| WP-CLI команда вручную | Быстрая и надёжная очистка, подходит для больших баз | Требует доступа к серверу и навыков командной строки | Средние и крупные магазины, специалисты с доступом к серверу |
| Плагины для очистки заказов | Интерфейс, готовые решения, часто с дополнительными функциями | Могут влиять на производительность, не всегда гибкие | Новички, желающие быстро настроить без кода |