Диагностика проблемы: зачем удалять отменённые заказы WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливаются отменённые заказы. По умолчанию WooCommerce не удаляет их автоматически, и они остаются в базе данных, занимая место и замедляя работу административной панели, а также увеличивая объём бэкапов. Это особенно заметно при большом количестве заказов.
Чтобы проверить количество отменённых заказов, можно использовать SQL-запрос к базе данных:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';Если число отменённых заказов превышает несколько сотен или тысяч, имеет смысл настроить автоматическое удаление.
Пошаговое решение: как автоматически удалять отменённые заказы в WooCommerce
1. Создание функции удаления отменённых заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wplab_delete_cancelled_orders() {
// Получаем отменённые заказы старше 7 дней
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '7 days ago',
),
),
'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. Запуск функции по расписанию с помощью WP-Cron
Создайте событие, которое будет запускать удаление один раз в сутки:
if (!wp_next_scheduled('wplab_daily_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wplab_daily_delete_cancelled_orders');
}
add_action('wplab_daily_delete_cancelled_orders', 'wplab_delete_cancelled_orders');3. Очистка при удалении расписания (опционально)
Чтобы избежать дублирования событий, добавьте удаление расписания при деактивации плагина или темы:
function wplab_clear_scheduled_delete() {
$timestamp = wp_next_scheduled('wplab_daily_delete_cancelled_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wplab_daily_delete_cancelled_orders');
}
}
register_deactivation_hook(__FILE__, 'wplab_clear_scheduled_delete');Проверка результата после внедрения
- Через 24 часа после добавления кода проверьте, что отменённые заказы старше 7 дней удалены. Для этого выполните SQL-запрос из раздела диагностики и сравните с предыдущим значением.
- В админке WooCommerce в разделе Заказы убедитесь, что отменённые заказы исчезают по мере старения.
- Если хотите протестировать сразу, временно замените
'7 days ago'на'1 day ago'и вызовите функцию вручную:
wplab_delete_cancelled_orders();Частые ошибки и как их исправить
- Удаление не происходит: Проверьте, активировано ли событие WP-Cron. Для диагностики установите плагин WP Crontrol и убедитесь, что задача
wplab_daily_delete_cancelled_ordersв расписании. - Заказы не удаляются из базы данных: Убедитесь, что используете
wp_delete_post($order_id, true)с параметромtrueдля полного удаления, а не перемещения в корзину. - Удаляются не те заказы: Проверьте параметр
post_status. Для отменённых заказов статус должен бытьwc-cancelled. Также стоит проверить, что датаpost_dateсоответствует дате создания заказа. - Производительность падает при удалении: При большом числе заказов разбейте удаление на чанки по 100 заказов за один запуск, чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Резервное копирование: Перед внедрением автоматического удаления сделайте полное резервное копирование базы данных.
- Использование чанков: Для стабильной работы используйте разбиение на порции, например:
function wplab_delete_cancelled_orders_chunk() {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'date_query' => array(
array('column' => 'post_date', 'before' => '7 days ago'),
),
'posts_per_page' => 100,
'fields' => 'ids',
);
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}
add_action('wplab_daily_delete_cancelled_orders', 'wplab_delete_cancelled_orders_chunk');- Контроль логов: Добавьте логирование удалённых заказов для отладки:
function wplab_delete_cancelled_orders() {
$orders = get_posts([...]);
foreach ($orders as $order_id) {
if (wp_delete_post($order_id, true)) {
error_log('Удалён заказ ID: ' . $order_id);
}
}
}- Альтернативы: Для удобства есть плагины, например Clearfy Pro, которые умеют очищать базу WooCommerce от ненужных данных. Но код позволяет гибко настроить условия удаления.
Сравнение способов удаления отменённых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, нет кода | Трудоёмко, не автоматично |
| Плагин Clearfy Pro или аналог | Автоматизация, удобный интерфейс | Платные, может не соответствовать специфическим требованиям |
| Собственный код с WP-Cron | Гибкость, бесплатность, полное управление | Необходимы базовые навыки разработки, возможны ошибки без тестирования |