Диагностика проблемы с удалением отменённых заказов в WooCommerce
В стандартной установке WooCommerce отменённые заказы остаются в базе данных навсегда. Это приводит к увеличению размера базы, замедлению запросов и ухудшению производительности магазина, особенно при большом количестве заказов. Автоматизация удаления таких заказов по дате поможет поддерживать базу в актуальном состоянии без ручных действий.
Как понять, что это ваша проблема?
- Рост таблицы
wp_postsс типомshop_order. - Большое количество заказов со статусом
cancelledв WooCommerce. - Замедленная работа админки при просмотре заказов.
Пошаговое решение: автоматическое удаление отменённых заказов по дате
Для удаления отменённых заказов, которым больше определённого количества дней, оптимально использовать планировщик задач WordPress (WP-Cron). Ниже пример кода, который:
- Ищет заказы со статусом
cancelled, старше 30 дней. - Удаляет эти заказы вместе с метаданными.
- Запускается ежедневно.
Добавление кода в файл functions.php или в кастомный плагин
if ( ! wp_next_scheduled( 'delete_old_cancelled_orders_daily' ) ) {
wp_schedule_event( time(), 'daily', 'delete_old_cancelled_orders_daily' );
}
add_action( 'delete_old_cancelled_orders_daily', 'delete_old_cancelled_orders' );
function delete_old_cancelled_orders() {
$days = 30; // Удалять заказы старше 30 дней
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = [
'status' => 'cancelled',
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // Полное удаление
}
}
Как работает код
wp_schedule_eventрегистрирует задачу на ежедневный запуск.wc_get_ordersполучает отменённые заказы старше 30 дней.wp_delete_postудаляет заказ и связанные данные навсегда.
Проверка результата после внедрения
- Выполните вручную запуск задачи для проверки (см. ниже).
- Проверьте таблицу
wp_postsна наличие заказов со статусомcancelledстарше 30 дней. - Убедитесь, что эти заказы удалены.
- Проверьте, что на странице заказов в админке отображается корректное количество.
Запуск задачи вручную для теста:
do_action( 'delete_old_cancelled_orders_daily' );
Этот вызов можно сделать в консоли WP-CLI или временно добавить в код для отладки.
Частые ошибки и как их исправить
- Задача WP-Cron не запускается: проверьте, что WP-Cron включён (константа
DISABLE_WP_CRONне установлена вtrue). На некоторых хостингах WP-Cron не работает без реального трафика — настройте системный cron или запускайте вручную. - Удаление не происходит из-за прав: убедитесь, что пользователь, под которым выполняется скрипт, имеет права на удаление постов.
- Неверный статус заказа: статус должен быть точно
cancelled, без пробелов и в нижнем регистре. - Производительность при большом числе заказов: если заказов слишком много, стоит добавить пагинацию в выборку.
Практические советы по безопасности и производительности
- Используйте
limitи пагинацию при выборке, чтобы не перегружать сервер. - Перед удалением сделайте резервную копию базы данных.
- Запускайте задачу в тихое время суток, чтобы минимизировать влияние на пользователей.
- Для контроля логируйте удалённые заказы в отдельный файл.
- Если у вас большой магазин, рассмотрите использование WP-CLI для пакетных операций.
Сравнение вариантов удаления отменённых заказов
| Вариант | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоёмко при большом количестве заказов, риск пропуска |
| Плагин с автоматическим удалением | Автоматизация, удобство | Зависимость от стороннего кода, возможные конфликты |
| Кастомный код с WP-Cron (наш вариант) | Гибко, контролируемо, без плагинов | Требует знаний, настройка WP-Cron |