Диагностика проблемы с отменёнными заказами в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливаются отменённые заказы. Они не влияют на продажи напрямую, но загромождают базу данных, замедляют отчёты и увеличивают размер резервных копий. Если не удалять такие заказы, это может привести к замедлению работы админки и увеличению времени выполнения запросов.
Проверить количество отменённых заказов можно через админку WooCommerce в разделе Заказы, выбрав фильтр по статусу Отменён. Также можно выполнить SQL-запрос в базе данных:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';Если количество превышает несколько сотен, пора автоматизировать их удаление.
Пошаговое решение: автоматическое удаление отменённых заказов по расписанию
1. Создание функции для удаления отменённых заказов
Добавим функцию, которая будет удалять все заказы со статусом wc-cancelled старше определённого количества дней (например, 30):
function wpdirect_delete_cancelled_orders() {
global $wpdb;
$days = 30; // количество дней, по истечении которых заказы будут удалены
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID заказов со статусом отменён и датой создания старше threshold
$orders_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
$date_threshold
));
if (empty($orders_to_delete)) {
return;
}
foreach ($orders_to_delete as $order_id) {
wp_delete_post($order_id, true); // жесткое удаление
}
}2. Регистрация ежесуточного Cron-задания
Добавим задание в WordPress Cron, чтобы функция запускалась автоматически раз в день:
function wpdirect_schedule_cancelled_orders_deletion() {
if (!wp_next_scheduled('wpdirect_daily_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wpdirect_daily_delete_cancelled_orders');
}
}
add_action('wp', 'wpdirect_schedule_cancelled_orders_deletion');
add_action('wpdirect_daily_delete_cancelled_orders', 'wpdirect_delete_cancelled_orders');3. Добавление функции и задачи в файл functions.php или в собственный плагин
Рекомендуется оформить код в собственный плагин для удобства управления или добавить в functions.php активной темы с учётом возможных рисков при смене темы.
Проверка результата после внедрения
Чтобы убедиться, что удаление работает корректно, можно:
- В админке WooCommerce проверить количество отменённых заказов до и после запуска Cron.
- Запустить функцию вручную через WP-CLI:
wp eval 'wpdirect_delete_cancelled_orders();'- Проверить логи сервера на наличие ошибок.
- Убедиться, что удалённые заказы отсутствуют в базе (через phpMyAdmin или другой инструмент).
Частые ошибки и их исправление
- Задача Cron не запускается: проверьте, что WordPress Cron работает (выполните
wp cron event listс WP-CLI). Если сайт малопосещаемый, активируйте системный Cron (real cron) для запускаwp-cron.php. - Заказы не удаляются: убедитесь, что функция
wp_delete_post()вызывается с параметромtrueдля полного удаления, а не перемещения в корзину. - Удаляются не те заказы: проверьте правильность статуса
wc-cancelledи даты создания (полеpost_dateв базе). - Проблемы с производительностью при большом количестве заказов: разнесите удаление по партиям с помощью
LIMITв SQL-запросе.
Практические советы по безопасности и производительности
- Резервное копирование: перед внедрением автоматического удаления делайте резервную копию базы данных.
- Лимит пакетов удаления: для магазинов с тысячами отменённых заказов ограничьте количество удаляемых записей за один запуск, например, так:
function wpdirect_delete_cancelled_orders_batch() {
global $wpdb;
$days = 30;
$limit = 100; // удалять по 100 заказов за раз
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$orders_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s LIMIT %d",
$date_threshold, $limit
));
if (empty($orders_to_delete)) {
return;
}
foreach ($orders_to_delete as $order_id) {
wp_delete_post($order_id, true);
}
}- Логирование: добавьте логирование удалённых заказов в отдельный файл или таблицу для контроля.
- Проверка прав: убедитесь, что пользователь или процесс, который запускает Cron, имеет необходимые права на удаление заказов.
Сравнение вариантов удаления отменённых заказов
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное удаление через админку | Просто, без кода | Трудоёмко при большом количестве заказов | Малые магазины |
| Плагин для очистки заказов | Автоматизация, интерфейс | Дополнительная нагрузка, зависимость от плагина | Средние и крупные магазины |
| Код с Cron-заданием (описано в статье) | Минимальная нагрузка, гибкость, полное удаление | Необходимость поддержки кода | Любые магазины с базовыми навыками разработки |