Диагностика проблемы: зачем удалять заказы со статусом «Отменен»
В интернет-магазинах на WooCommerce накопление заказов со статусом «Отменен» затрудняет управление и замедляет работу админки. Такие заказы не влияют на аналитику по продажам и могут создавать лишнюю нагрузку на базу данных, особенно при большом объеме.
Проверить количество заказов со статусом «Отменен» можно в админ-панели WooCommerce, перейдя в раздел WooCommerce > Заказы и отфильтровав по статусу «Отменен».
Пошаговое решение: автоматическое удаление заказов с помощью кода
1. Создаем функцию для удаления заказов
Добавьте следующий код в файл functions.php вашей темы (или в плагин для кастомного кода):
function wp_puzzle_delete_cancelled_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}2. Запускаем удаление по расписанию (cron)
Чтобы автоматизировать процесс, зарегистрируем пользовательское событие и запланируем его выполнение раз в сутки.
// Регистрируем cron событие при активации темы или плагина
function wp_puzzle_schedule_cancelled_orders_cleanup() {
if (!wp_next_scheduled('wp_puzzle_cleanup_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wp_puzzle_cleanup_cancelled_orders');
}
}
add_action('wp', 'wp_puzzle_schedule_cancelled_orders_cleanup');
// Очищаем cron при деактивации темы/плагина
function wp_puzzle_clear_cancelled_orders_cleanup() {
$timestamp = wp_next_scheduled('wp_puzzle_cleanup_cancelled_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wp_puzzle_cleanup_cancelled_orders');
}
}
// Здесь нужно повесить на хуки деактивации темы или плагина
// Привязываем функцию удаления к событию
add_action('wp_puzzle_cleanup_cancelled_orders', 'wp_puzzle_delete_cancelled_orders');Проверка результата после внедрения
После установки кода и работы планировщика (cron) проверьте:
- В админке WooCommerce исчезли заказы со статусом «Отменен».
- В базе данных (таблица
wp_posts) не осталось записей заказов со статусомwc-cancelled. - В логах сервера нет ошибок, связанных с удалением заказов.
Для ручной проверки можно временно вызвать wp_puzzle_delete_cancelled_orders() напрямую в admin_init, но не забывайте отключить после теста.
Частые ошибки и как их исправить
- Удаление не происходит: проверьте, что cron события действительно работают. Используйте плагин WP Crontrol для просмотра и управления задачами cron.
- Заказы не удаляются полностью: параметр
wp_delete_postсtrueна втором аргументе гарантирует полное удаление, включая метаданные. Если не работает, проверьте права пользователя. - Удаляются не те заказы: убедитесь, что в запросе
post_statusуказан именноwc-cancelled, а неcancelledили другой статус. - Производительность падает при большом количестве заказов: ограничьте число удаляемых заказов за один запуск, добавив параметр
posts_per_pageнапример 100, и реализуйте постепенное удаление.
Практические советы по безопасности и производительности
- Не запускайте удаление на фронтенде сайта — используйте хуки, работающие в админке или cron.
- Добавьте проверку прав пользователя, если вызываете функцию вручную.
- Для больших магазинов безопаснее реализовать пакетное удаление с отслеживанием прогресса.
- Перед удалением рекомендуем делать регулярные резервные копии базы данных.
Сравнение способов удаления заказов «Отменен»
| Метод | Плагин | Код | Плюсы | Минусы |
|---|---|---|---|---|
| Удаление вручную | — | — | Простота | Требует времени, риск пропустить заказы |
| Плагин очистки заказов | WooCommerce Order Cleanup | — | Удобство, настройки графика | Доп нагрузка, возможные конфликты |
| Автоматизация через код | — | Демонстрированный код выше | Минимальная нагрузка, кастомизация | Требует навыков, ответственность за тестирование |