Диагностика проблемы: зачем автоматизировать удаление отменённых заказов
В WooCommerce с течением времени накапливаются отменённые заказы, которые не несут ценности для аналитики или бухгалтерии, но занимают место в базе данных. Это может замедлять работу сайта и усложнять администрирование. Ручное удаление неудобно и требует регулярного времени. Поэтому нужна автоматизация удаления отменённых заказов по расписанию.
Пошаговое решение: создание WP-Cron задачи для удаления отменённых заказов
Шаг 1. Регистрация задачи Cron
Добавим функцию, которая запланирует событие wp_delete_cancelled_orders в WordPress Cron, если оно ещё не запланировано.
function schedule_delete_cancelled_orders_event() {
if ( ! wp_next_scheduled( 'wp_delete_cancelled_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wp_delete_cancelled_orders' );
}
}
add_action( 'wp', 'schedule_delete_cancelled_orders_event' );Шаг 2. Создание функции удаления заказов
Создадим функцию, которая найдет отменённые заказы старше 7 дней и удалит их из базы.
function delete_cancelled_orders() {
$args = [
'limit' => -1,
'status' => 'cancelled',
'date_modified' => '<' . ( time() - WEEK_IN_SECONDS ),
'return' => 'ids',
];
$orders = wc_get_orders( $args );
if ( ! empty( $orders ) ) {
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
}
add_action( 'wp_delete_cancelled_orders', 'delete_cancelled_orders' );Шаг 3. Проверка работы Cron
Для отладки рекомендуем использовать плагин WP Crontrol, который позволит увидеть и запустить Cron задачи вручную.
Проверка результата после внедрения
- Создайте тестовый заказ в статусе
cancelled, которому более 7 дней (можно изменить дату в базе для теста). - Запустите событие
wp_delete_cancelled_ordersвручную через WP Crontrol. - Проверьте, что заказ удалён из базы (раздел WooCommerce → Заказы).
- Убедитесь, что новые отменённые заказы остаются, пока не достигнут 7 дней.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что статус заказа действительно
cancelled, а не, например,failedилиrefunded. Используйтеwc_get_ordersс правильными аргументами. - Задача Cron не запускается: убедитесь, что WordPress Cron работает на вашем хостинге. На некоторых серверах требуется реальный системный Cron для надежности.
- Удаление не происходит из-за прав: функция
wp_delete_postс флагомtrueудаляет пост без перемещения в корзину, но если есть ограничения на уровне базы, это может блокироваться. - Неправильный формат времени в параметре
date_modified:wc_get_ordersпринимает даты в форматеYYYY-MM-DD HH:MM:SS, нельзя передавать timestamp напрямую.
Практические советы по безопасности и производительности
- Рекомендуется не удалять сразу все отменённые заказы, а ограничивать выборку по дате, чтобы не создавать нагрузку на базу.
- Для надежной работы Cron используйте системный Cron, который вызывает
wp-cron.phpраз в час или день. - Если заказов много, разбивайте удаление на чанки, чтобы избежать превышения лимитов PHP.
- Перед удалением сделайте резервную копию базы, особенно если заказы содержат важные данные.
Исправленный код удаления с учетом формата даты и чанков
function delete_cancelled_orders() {
$date = date( 'Y-m-d H:i:s', time() - WEEK_IN_SECONDS );
$args = [
'limit' => 50, // удаляем по 50 заказов за раз
'status' => 'cancelled',
'date_modified' => '<' . $date,
'return' => 'ids',
];
$orders = wc_get_orders( $args );
if ( ! empty( $orders ) ) {
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
}
add_action( 'wp_delete_cancelled_orders', 'delete_cancelled_orders' );Сравнение вариантов реализации автоматического удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, WP Rocket, Clearfy Pro с очисткой базы) | Простота использования, интерфейс, поддержка | Дополнительные нагрузки, платные функции |
| Реализация через WordPress Cron и код | Гибкость, контроль, бесплатно | Требуется техническая экспертиза, возможность ошибок |
| Ручное удаление через админку | Простота, без кода | Трудозатратно, неэффективно при большом объёме |