Диагностика проблемы: зачем удалять отменённые и заблокированные заказы
В стандартной установке WooCommerce отменённые или заблокированные (on-hold) заказы остаются в базе данных навсегда, что приводит к росту объёма таблиц и снижению производительности. Особенно это актуально для крупных магазинов с тысячами заказов. Автоматизация удаления таких заказов с отсрочкой позволяет сохранить данные для анализа в течение определённого времени, но при этом не захламлять базу.
Как работает статус заказа в WooCommerce
WooCommerce использует следующие статусы заказов:
pending— ожидает оплаты;processing— оплата прошла, заказ обрабатывается;on-hold— заказ поставлен на паузу (например, ожидание оплаты);completed— заказ выполнен;cancelled— заказ отменён;refunded— заказ возвращён;failed— оплата не удалась.
Наш сценарий — удалять заказы со статусом cancelled и on-hold после заданного периода (например, 30 дней).
Пошаговое решение: реализация автоматического удаления заказов с отсрочкой
1. Создаём функцию удаления заказов по статусу и дате
function wptricks_delete_old_orders() {
$statuses = array('cancelled', 'on-hold');
$days = 30; // Количество дней до удаления
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
foreach ($statuses as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'posts_per_page' => -1,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление заказа
}
}
}
}2. Запускаем функцию по расписанию с помощью WP-Cron
Добавим ежесуточное событие для запуска очистки:
// Регистрация события при активации темы или плагина
function wptricks_schedule_order_cleanup() {
if (!wp_next_scheduled('wptricks_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptricks_daily_order_cleanup');
}
}
add_action('wp', 'wptricks_schedule_order_cleanup');
// Обработка события
add_action('wptricks_daily_order_cleanup', 'wptricks_delete_old_orders');
// Очистка при деактивации темы или плагина
function wptricks_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wptricks_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wptricks_daily_order_cleanup');
}
}Проверка результата после внедрения
- После установки кода подождите 24 часа или запустите хук вручную через WP-CLI:
wp cron event run wptricks_daily_order_cleanup. - Проверьте в базе данных таблицу
wp_posts: записи с post_typeshop_orderи статусамиwc-cancelledилиwc-on-hold, у которых дата старше 30 дней, должны быть удалены. - В админке WooCommerce убедитесь, что старые отменённые и заблокированные заказы отсутствуют.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, запущен ли CRON и активен ли хук. Можно временно добавить
error_logв функцию удаления для отладки. - Удаляются нужные заказы: Убедитесь, что фильтр по дате и статусу корректен. Не используйте
wp_trash_post, если хотите удалить полностью — используйтеwp_delete_post($id, true). - Повышенная нагрузка на базу: Если заказов очень много, делайте удаление партиями (например, по 100 заказов за один запуск), чтобы снизить нагрузку.
Практические советы по безопасности и производительности
- Не удаляйте заказы без отсрочки — сохраните данные для анализов и возвратов.
- Используйте транзакции и бэкапы, если удаляете заказы массово.
- Добавьте логирование в отдельный файл или таблицу для аудита удалённых заказов.
- Оптимизируйте запросы с помощью индексов по дате и статусу в базе данных.
Сравнение вариантов реализации автоматического удаления заказов
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Плагин (например, WooCommerce Cleaner) | Простота настройки, интерфейс | Может быть тяжелым, нет гибкости | Установка и настройка через админку |
| WP-Cron + кастомный код | Гибкость, контроль, легковесность | Требует навыков разработки | Код из статьи |
| Ручное удаление через SQL | Быстро для единичных случаев | Риск ошибок, нет автоматизации | DELETE FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-cancelled' AND post_date < '2023-03-01' |