Диагностика проблемы: автоматическое удаление закрытых заказов не срабатывает
В WooCommerce часто возникает задача — автоматически удалять заказы со статусом completed, cancelled или refunded через определённое время, чтобы не перегружать базу. Однако стандартный код с WP-Cron или хуками часто не работает должным образом: заказы не удаляются, или процесс прерывается.
Причины могут быть следующие:
- WP-Cron не запускается из-за низкой активности сайта или отключённого системного cron;
- код удаления не учитывает зависимости заказов и связанные данные — удаление прерывается из-за ошибок в базе;
- неправильное использование функций WooCommerce и WordPress для удаления заказов;
- ограничения хостинга на длительное выполнение скриптов или ограничения MySQL;
- отсутствие проверки прав на удаление заказов;
- конфликты с другими плагинами, которые блокируют удаление заказов.
Пошаговое решение: как настроить безопасное и рабочее автоматическое удаление заказов
1. Настройка системного cron для запуска WP-Cron
WP-Cron зависит от посещений сайта, что не всегда гарантирует своевременный запуск задач. Лучше настроить системный cron, который будет вызывать wp-cron.php с интервалом, например, каждые 15 минут.
*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Замените https://example.com на ваш URL.
2. Создайте кастомную функцию для удаления заказов старше N дней
Используйте правильный класс WC_Order_Query для выборки заказов, а затем удаляйте их через метод wp_delete_post с параметром true для полного удаления.
function wpassist_delete_old_completed_orders() {
$days = 30; // количество дней
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'limit' => -1,
'status' => ['completed', 'cancelled', 'refunded'],
'date_created' => '<' . $date,
'return' => 'ids',
];
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
// Проверяем права
if (!current_user_can('delete_post', $order_id)) {
continue;
}
// Полное удаление заказа и связанных данных
wp_delete_post($order_id, true);
}
}
3. Запланируйте запуск функции через WP-Cron
function wpassist_schedule_order_cleanup() {
if (!wp_next_scheduled('wpassist_delete_old_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wpassist_delete_old_orders_hook');
}
}
add_action('wp', 'wpassist_schedule_order_cleanup');
add_action('wpassist_delete_old_orders_hook', 'wpassist_delete_old_completed_orders');
Проверка результата после внедрения
- Подождите 24 часа или форсируйте выполнение WP-Cron вручную (через плагин WP Crontrol или вызов скрипта).
- Проверьте в базе данные заказов со статусами
completed,cancelled,refunded, созданных старше 30 дней — они должны отсутствовать. - Проверьте журнал ошибок сервера на наличие ошибок при удалении.
- Проверьте, что новые заказы не удаляются преждевременно.
Частые ошибки и как их исправить
- WP-Cron не запускается: Настройте системный cron или используйте плагин WP Crontrol для ручного запуска.
- Удаление прерывается из-за ограничений прав: функция проверяет
current_user_can('delete_post'), убедитесь что выполняется с нужными правами (например, от имени администратора). - Заказы не удаляются, потому что используются неправильные статусы или неверный формат даты: используйте стандартные статусы WooCommerce и формат даты
Y-m-d H:i:s. - Удаляются не те заказы или слишком новые: проверьте логику вычисления даты и фильтрации в
wc_get_orders. - Конфликты с другими плагинами: временно деактивируйте подозрительные плагины и проверьте работу скрипта.
Практические советы по производительности и безопасности
- Обработка партий: если заказов много, разбейте удаление на партии по 50–100 штук, чтобы избежать превышения лимитов памяти и времени выполнения.
- Логи и отчёты: ведите логи удалённых заказов для последующего аудита.
- Резервное копирование: перед массовым удалением сделайте резервную копию базы данных.
- Безопасность: не удаляйте заказы просто по ID, всегда проверяйте права и статусы.
- Оптимизация запросов: используйте индексы в базе для поля
post_dateиpost_status(стандарт в WordPress), чтобы ускорить выборку.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы | Примеры |
|---|---|---|---|
| Плагин (например, WP Bulk Delete) | Простота настройки, графический интерфейс | Дополнительная нагрузка, ограничения функционала | Clearfy Pro помогает с оптимизацией |
| Кастомный код с WP-Cron | Гибкость, контроль, без лишних плагинов | Нужны знания, возможны ошибки в коде | Пример кода в статье |
| Ручное удаление из базы (SQL) | Скорость, прямой контроль | Риск повредить данные, отсутствие связей | Не рекомендуется для новичков |