Диагностика проблемы с отменёнными заказами в WooCommerce
В крупных интернет-магазинах на WooCommerce число отменённых заказов может быстро расти. Это приводит к увеличению размера базы данных, замедлению запросов и усложнению управления заказами. Часто администраторы не удаляют отменённые заказы вручную, а стандартного инструмента для массового удаления WooCommerce не предоставляет. Для решения задачи необходима автоматизация удаления отменённых заказов по расписанию.
Пошаговое решение: как настроить автоматическое удаление отменённых заказов
1. Создание пользовательской функции удаления отменённых заказов
Добавьте следующий код в файл functions.php вашей темы (рекомендуется использовать дочернюю тему) или в отдельный плагин:
function wpmy_delete_cancelled_orders() {
global $wpdb;
// Получаем ID заказов со статусом cancelled старше 7 дней
$days = 7;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$orders = wc_get_orders(array(
'limit' => -1,
'status' => 'cancelled',
'date_created' => '<' . $date_threshold,
'return' => 'ids',
));
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление заказа
}
}
}2. Подключение функции к WP-Cron для автоматического запуска
Добавьте событие в расписание WordPress. Например, запуск раз в сутки:
function wpmy_schedule_cancelled_orders_cleanup() {
if (!wp_next_scheduled('wpmy_daily_cancelled_orders_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpmy_daily_cancelled_orders_cleanup');
}
}
add_action('wp', 'wpmy_schedule_cancelled_orders_cleanup');
add_action('wpmy_daily_cancelled_orders_cleanup', 'wpmy_delete_cancelled_orders');3. Как проверить, что очистка работает
- Создайте тестовый заказ в WooCommerce и отмените его.
- Измените в коде значение
$daysна0, чтобы удалять заказы сразу. - Выполните вручную событие WP-Cron через плагин WP Crontrol или с помощью вызова URL
wp-cron.php. - Проверьте, что заказ исчез из списка заказов WooCommerce.
Частые ошибки и их исправление
- Заказы не удаляются: Убедитесь, что статус заказа действительно
cancelled, а неfailedилиrefunded. Для проверки используйте админку или запрос черезwc_get_orders(). - WP-Cron не срабатывает: Проверьте, что на сайте не отключён WP-Cron (
DISABLE_WP_CRONне должен быть true). Для теста запустите воркфлоу вручную через плагин WP Crontrol. - Удаление не полное: Используйте параметр
wp_delete_post($order_id, true)для полного удаления, иначе запись будет в корзине.
Практические советы по безопасности и производительности
- Не удаляйте заказы, если они могут понадобиться для отчетности. Лучше использовать фильтр по дате создания (например, старше 30 дней).
- Планируйте очистку в периоды низкой нагрузки, чтобы не создавать дополнительный стресс для базы данных.
- Используйте Clearfy Pro для дополнительной оптимизации базы данных и удаления мусора.
Сравнение подходов к удалению отменённых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль каждого заказа | Затратно по времени, риск пропуска заказов |
| Автоматизация через WP-Cron и код | Полная автоматизация, гибкость настройки | Нужны навыки программирования, возможные ошибки при неправильном коде |
| Плагины очистки базы данных | Простота, дополнительные функции оптимизации | Могут удалять лишнее, нагрузка на сервер |