Диагностика проблемы: зачем и когда нужно автоматическое удаление заказов в WooCommerce
В больших интернет-магазинах WooCommerce накапливаются заказы с разными статусами, включая отменённые, ожидающие оплаты или старые черновики. Если не очищать базу, это снижает производительность и затрудняет администрирование. Автоматическое удаление заказов по сроку помогает поддерживать базу в чистоте без ручного вмешательства.
Типичные сценарии для удаления заказов:
- Удаление отменённых заказов старше 30 дней.
- Удаление заказов со статусом «ожидает оплаты» старше 7 дней.
- Удаление черновиков заказов (auto-drafts) для очистки базы.
В WooCommerce нет встроенного механизма для автоматического удаления заказов по сроку, и большинство решений используют плагины. Однако можно реализовать собственное решение через WP-Cron и стандартные функции WooCommerce.
Пошаговое решение: код для автоматического удаления заказов по сроку
1. Создаём функцию удаления заказов по статусу и сроку
В файл functions.php вашей темы (лучше дочерней) или в кастомный плагин добавьте следующий код.
function wpt_delete_old_orders() {
// Статусы заказов и сроки хранения в днях
$order_statuses = [
'cancelled' => 30, // отменённые старше 30 дней
'pending' => 7, // ожидают оплаты старше 7 дней
'failed' => 30 // неудачные старше 30 дней
];
foreach ($order_statuses as $status => $days) {
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'status' => $status,
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
];
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_trash_post($order_id); // перемещаем в корзину
}
}
// Дополнительно: удалить auto-draft заказы старше 1 дня
global $wpdb;
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'auto-draft' AND post_date < %s",
date('Y-m-d H:i:s', strtotime('-1 day'))
)
);
}2. Регистрируем крон-задачу для ежедневного запуска
Добавьте в functions.php следующий код для регистрации и планирования ежедневного события.
function wpt_schedule_delete_old_orders() {
if (!wp_next_scheduled('wpt_daily_delete_old_orders_event')) {
wp_schedule_event(time(), 'daily', 'wpt_daily_delete_old_orders_event');
}
}
add_action('wp', 'wpt_schedule_delete_old_orders');
add_action('wpt_daily_delete_old_orders_event', 'wpt_delete_old_orders');3. Очистка крон-задачи при деактивации темы или плагина
Чтобы предотвратить накопление ненужных крон-задач, добавьте очистку при деактивации.
function wpt_clear_scheduled_delete_old_orders() {
$timestamp = wp_next_scheduled('wpt_daily_delete_old_orders_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpt_daily_delete_old_orders_event');
}
}
register_deactivation_hook(__FILE__, 'wpt_clear_scheduled_delete_old_orders');Проверка результата после внедрения
Чтобы убедиться, что удаление работает:
- Создайте тестовые заказы с нужным статусом и датой создания, например, 10 дней назад для статуса
pending. - Запустите вручную функцию
wpt_delete_old_orders()через консоль WP-CLI или временно вызовите её в коде. - Проверьте, что заказы перемещены в корзину в разделе «Заказы» админки WooCommerce.
- Проверьте wp-cron: введите
https://example.com/wp-cron.php?doing_wp_cronв браузере, чтобы запустить события, затем проверьте логи и заказы.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что в
wc_get_orders()корректно передаются параметры, статус заказа совпадает с реальным. Используйте var_dump для отладки. - WP-Cron не срабатывает: на некоторых хостингах cron требует внешнего вызова. Настройте системный cron на вызов
wp-cron.phpили используйте плагин для мониторинга. - Удаление не происходит из-за прав: убедитесь, что у пользователя сессии WP есть права на удаление постов типа
shop_order. - Удаляются не те заказы: проверьте правильность сравнения дат и статусов, учитывайте часовой пояс сайта.
Практические советы по безопасности и производительности
- Для больших магазинов удаляйте заказы пакетами, чтобы не перегружать базу. Можно модифицировать код, добавив лимит и повторный запуск.
- Используйте
wp_trash_post(), а неwp_delete_post(), чтобы сохранить возможность восстановления заказов. - Регулярно проверяйте логи ошибок и производительности, чтобы убедиться, что крон-задача не тормозит сайт.
- Для мониторинга cron-задач используйте плагин Clearfy Pro, который помогает управлять и оптимизировать задачи WP-Cron.
Сравнение вариантов решения удаления заказов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Плагин автоматического удаления заказов | Удобство, готовые настройки, интерфейс | Может нагружать сайт, лишний код, риск конфликтов | Использовать для небольших магазинов или без опыта кода |
| Кастомный код с WP-Cron (как в статье) | Лёгкий, быстрый, без сторонних зависимостей, можно кастомизировать | Необходимы навыки, требует тестирования и поддержки | Лучше для опытных разработчиков и крупных магазинов |
| Удаление вручную через админку | Простота, нет кода | Трудоёмко, не автоматизируется, ошибки при больших объёмах | Подходит для редких случаев |