Диагностика задачи: зачем и когда нужно удалять заказы автоматически
В WooCommerce с течением времени база данных может разрастаться из-за накопления заказов со статусами, которые уже неактуальны, например, отменённые, неоплаченные или завершённые заказы старше определённого срока. Это влияет на производительность сайта и усложняет администрирование. Встроенных инструментов для массового автоматического удаления заказов по статусу и времени нет, поэтому задача требует кастомного решения.
Как реализовать автоматическое удаление заказов по статусу и времени
Подключение к WP Cron для регулярного запуска
Для автоматизации удаления заказов используем WP Cron — штатный планировщик задач WordPress. Запланируем задачу, которая будет запускаться, например, раз в сутки.
if ( ! wp_next_scheduled( 'wc_delete_old_orders_cron_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_old_orders_cron_hook' );
}
add_action( 'wc_delete_old_orders_cron_hook', 'wc_delete_old_orders' );Функция удаления заказов по статусу и времени
В функции мы будем искать заказы с нужными статусами, созданные раньше указанной даты, и удалять их без возможности восстановления (force delete). Пример ниже удаляет отменённые заказы старше 30 дней и неоплаченные старше 14 дней.
function wc_delete_old_orders() {
$statuses = [
'wc-cancelled' => 30, // отменённые старше 30 дней
'wc-pending' => 14, // ожидают оплаты старше 14 дней
];
foreach ( $statuses as $status => $days ) {
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = [
'status' => $status,
'limit' => -1,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
];
$orders = wc_get_orders( $args );
if ( ! empty( $orders ) ) {
foreach ( $orders as $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
// Безопасное удаление заказа
wp_delete_post( $order_id, true );
}
}
}
}
}Проверка результата после внедрения
Чтобы удостовериться в корректности работы, выполните следующие действия:
- В админке WooCommerce перейдите в раздел «Заказы» и отметьте количество заказов с указанными статусами и датами.
- Вручную запустите функцию
wc_delete_old_orders()через WP CLI или добавив временный вызов в functions.php. - Обновите страницу заказов, проверьте, что старые заказы с нужными статусами удалены.
- Проверьте логи ошибок сервера и WordPress на наличие сбоев.
Частые ошибки и как их исправить
- Ошибка: Заказы не удаляются, хотя cron работает.
Причина: Неправильный формат статусов (нужно указывать с префиксомwc-, например,wc-cancelled).
Решение: Проверьте статус заказа через админку или кодомwc_get_order_statuses(). - Ошибка: WP Cron не срабатывает.
Причина: На вашем хостинге нет посещений сайта или отключён wp-cron.
Решение: Настройте системный cron на вызовwp-cron.phpили запускайте функцию вручную через WP CLI. - Ошибка: Ошибки в логах при удалении заказов.
Причина: Некорректные объекты заказа или права доступа.
Решение: Проверьте, что пользователь, от имени которого выполняется код, имеет права на удаление постов типаshop_order.
Практические советы по безопасности и производительности
- Безопасность: Используйте
wp_delete_post( $order_id, true )для полного удаления, убедитесь, что функция не вызывается случайно или без контроля, чтобы не удалить нужные данные. - Производительность: Ограничьте количество удаляемых заказов за один запуск, при необходимости добавьте пагинацию, чтобы не перегружать сервер.
- Мониторинг: Логируйте удалённые заказы в файл, чтобы при необходимости восстановить информацию из резервной копии.
Сравнительная таблица способов удаления заказов
| Способ | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WP Bulk Delete) | Готовое UI, удобство | Дополнительная нагрузка, не всегда гибко |
| Код через WP Cron (как в статье) | Полный контроль, без лишних плагинов | Требует навыков, правильной настройки cron |
| Ручное удаление в админке | Просто, без кода | Не автоматизировано, долго при большом объёме |