Диагностика задачи: зачем и когда нужна автоматическая очистка заказов
В магазинах на WooCommerce с большим количеством заказов быстро накапливается много данных, особенно если есть заказы в статусах «отменён», «ожидает оплаты» или «выполнен». Это замедляет работу админки и увеличивает размер базы данных. Автоматическое удаление заказов по определённым статусам помогает поддерживать базу в порядке и улучшает производительность.
Как настроить автоматическое удаление заказов по статусу: пошаговое решение
1. Определяем нужные статусы для удаления
Чаще всего удаляют заказы со статусами:
- cancelled (отменённые)
- failed (неудачные)
- pending (ожидают оплаты)
Выбирайте те, которые действительно не нужны для аналитики или повторных попыток оплаты.
2. Создаём функцию для удаления заказов
Добавьте следующий код в файл functions.php вашей темы (лучше дочерней) или в кастомный плагин:
function wpapp_delete_orders_by_status() {
// Статусы заказов для удаления
$statuses = array('cancelled', 'failed', 'pending');
foreach ($statuses as $status) {
// Получаем заказы со статусом
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - удаление без перемещения в корзину
}
}
}3. Автоматизация через WP-Cron
Чтобы удаление происходило автоматически, добавим задачу в WP-Cron, например, раз в неделю:
function wpapp_schedule_order_deletion() {
if (!wp_next_scheduled('wpapp_delete_orders_event')) {
wp_schedule_event(time(), 'weekly', 'wpapp_delete_orders_event');
}
}
add_action('wp', 'wpapp_schedule_order_deletion');
add_action('wpapp_delete_orders_event', 'wpapp_delete_orders_by_status');4. Удаление задачи при деактивации
Чтобы избежать мусора, удалим запланированное событие при деактивации плагина/темы:
function wpapp_clear_scheduled_order_deletion() {
$timestamp = wp_next_scheduled('wpapp_delete_orders_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpapp_delete_orders_event');
}
}
register_deactivation_hook(__FILE__, 'wpapp_clear_scheduled_order_deletion');Проверка результата после внедрения
- Зайдите в админку WooCommerce → Заказы, отфильтруйте по статусам, которые указали в коде. Заказы с этими статусами должны отсутствовать.
- Если хотите протестировать сразу, вызовите функцию
wpapp_delete_orders_by_status()вручную, например, через WP-CLI:wp eval 'wpapp_delete_orders_by_status();' - Проверьте логи ошибок сервера и WooCommerce на предмет ошибок удаления.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что статусы указываются с префиксом
wc-вpost_status. Неверный статус вернёт пустой список. - Удаление не происходит автоматически: Убедитесь, что WP-Cron работает. Можно протестировать вручную через WP-CLI или плагин WP Crontrol.
- Потеря важной информации: Проверьте список статусов перед удалением — иногда нужные заказы могут иметь похожие статусы.
- Проблемы с производительностью при большом количестве заказов: Делайте удаление пакетами, добавьте пагинацию в запрос:
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'posts_per_page' => 100, // пакет по 100 заказов
'paged' => $page_number,
'fields' => 'ids',
);Практические советы по безопасности и производительности
- Резервное копирование: Перед внедрением автоматического удаления убедитесь, что есть свежие бэкапы базы данных.
- Проверка прав: Функция удаления должна запускаться только с достаточными правами (обычно через WP-Cron это безопасно).
- Логирование: Добавьте логирование удалённых заказов для аудита и восстановления:
function wpapp_delete_orders_by_status() {
$statuses = array('cancelled', 'failed', 'pending');
foreach ($statuses as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
foreach ($orders as $order_id) {
if (wp_delete_post($order_id, true)) {
error_log("[Order Deletion] Deleted order ID: $order_id with status $status");
}
}
}
}Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Удаление вручную через админку | Просто, без кода | Трудоёмко, неэффективно при большом количестве | Подходит для редких случаев |
| Код с WP-Cron (как в статье) | Автоматизация, гибкость | Требует базовых знаний PHP и WP-Cron | Лучше для регулярного использования |
| Плагины для очистки WooCommerce | Готовые решения, интерфейс | Могут быть тяжёлыми, избыточными | Подходит, если хотите без кода |