Диагностика задачи: зачем и когда удалять заказы автоматически
В WooCommerce со временем база заказов может разрастаться, что влияет на производительность и удобство управления. Особенно это актуально для заказов с определёнными статусами, например, отменённые (cancelled) или неактивные (например, failed), которые уже не нужны для аналитики или поддержки. Автоматическое удаление таких заказов по дате поможет держать базу в чистоте без постоянного ручного контроля.
Пошаговое решение: удаление заказов по статусу и дате с помощью WP-Cron
1. Создание функции удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wc_delete_old_orders_by_status() {
// Настройки: статусы и возраст заказов (в днях)
$statuses_to_delete = array('cancelled', 'failed');
$days_old = 30; // удалять заказы старше 30 дней
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d', strtotime("-" . $days_old . " days")),
'inclusive' => true,
);
foreach ($statuses_to_delete as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'date_query' => array($date_query),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — принудительное удаление
}
}
}
}2. Запуск функции по расписанию WP-Cron
Чтобы функция запускалась автоматически, зарегистрируйте крон-задачу:
add_action('wc_delete_old_orders_event', 'wc_delete_old_orders_by_status');
function wc_schedule_delete_old_orders() {
if (!wp_next_scheduled('wc_delete_old_orders_event')) {
wp_schedule_event(time(), 'daily', 'wc_delete_old_orders_event');
}
}
add_action('wp', 'wc_schedule_delete_old_orders');3. Отмена расписания при деактивации темы/плагина
Чтобы избежать «зависших» крон-задач, добавьте функцию удаления расписания:
function wc_unschedule_delete_old_orders() {
$timestamp = wp_next_scheduled('wc_delete_old_orders_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_delete_old_orders_event');
}
}
register_deactivation_hook(__FILE__, 'wc_unschedule_delete_old_orders');Проверка результата после внедрения
1. Убедитесь, что заказы со статусом cancelled и failed, созданные более 30 дней назад, удалены.
2. Для теста можно временно уменьшить значение $days_old до 0 или 1 и создать тестовые заказы с нужным статусом и датой.
3. Чтобы проверить, сработал ли WP-Cron, используйте плагин WP Crontrol — он покажет запланированные события и позволит запускать их вручную.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что статусы указаны корректно с префиксом
wc-в аргументах запроса, и что функция действительно вызывается (WP-Cron работает). - Крон-задача не запускается: убедитесь, что на сайте есть посещения — WP-Cron запускается при загрузке страниц. Для теста можно вызвать событие вручную через WP Crontrol.
- Удаляются не те заказы: проверьте параметр
post_statusиdate_query— дата должна быть в форматеY-m-d, а статус — с префиксомwc-. - Ошибка при удалении: убедитесь, что у пользователя, от имени которого запускается код, есть права на удаление постов.
Практические советы по безопасности и производительности
- Резервные копии: перед автоматическим удалением рекомендуется настраивать регулярное резервное копирование базы.
- Пакетная обработка: если заказов много, можно ограничить количество удаляемых за один запуск, добавив параметр
posts_per_page(например, 50) и запускать несколько раз. - Логирование: для контроля процесса полезно добавить логирование удалённых заказов через
error_logили пользовательские записи в лог-файл. - Оптимизация запросов: используйте
fields => 'ids'для экономии памяти при выборке заказов.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы | Примечания |
|---|---|---|---|
| Плагин для очистки WooCommerce | Простота, UI для настройки | Может быть тяжеловесным, нет гибкости | Подходит для непрофессионалов |
| Код с WP-Cron (наш метод) | Гибкость, контроль, легковесность | Требует навыков, настройка вручную | Для разработчиков, можно кастомизировать |
| Ручное удаление через админку | Простота, моментальный эффект | Ручная работа, риск пропустить заказы | Для единичных случаев |