Диагностика проблемы: зачем и когда нужно удалять просроченные заказы
В WooCommerce заказы сохраняются в базе данных даже после того, как они становятся неактуальными (например, неоплаченные или отменённые заказы старше определённого срока). Это приводит к росту размера базы, замедлению админ-панели и усложнению аналитики. Особенно актуально для магазинов с большим потоком заказов.
Проверить количество старых заказов можно через SQL-запрос:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-pending') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);Если количество таких заказов велико, пора автоматизировать их удаление.
Пошаговое решение: автоматическое удаление просроченных заказов через wp_cron
1. Выбор статусов и периода удаления
Определите, какие статусы считать «просроченными» (чаще всего wc-cancelled, wc-failed, wc-pending) и за какой срок (например, 30 дней).
2. Создание функции удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wpse_delete_old_orders() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-failed', 'wc-pending'],
'date_query' => [
[
'column' => 'post_date',
'before' => '30 days ago',
],
],
'posts_per_page' => 50, // обрабатываем порциями
'fields' => 'ids',
'no_found_rows' => true,
];
$old_orders = get_posts($args);
if (!empty($old_orders)) {
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true); // принудительно удалить
}
}
}3. Регистрация планировщика задач (wp_cron)
Добавьте регистрацию события:
add_action('wpse_delete_old_orders_event', 'wpse_delete_old_orders');
function wpse_schedule_old_orders_deletion() {
if (!wp_next_scheduled('wpse_delete_old_orders_event')) {
wp_schedule_event(time(), 'daily', 'wpse_delete_old_orders_event');
}
}
add_action('wp', 'wpse_schedule_old_orders_deletion');Этот код запускает удаление один раз в сутки.
Проверка результата после внедрения
- Через phpMyAdmin или любой SQL-клиент выполните запрос из раздела диагностики и сравните количество заказов до и после запуска кода.
- В админ-панели WooCommerce проверьте, что старые заказы исчезли.
- Для отладки временно замените
wp_delete_post($order_id, true);наerror_log('Удаляется заказ ID: '.$order_id);и просмотрите логи сервера.
Частые ошибки и способы их исправления
- Заказы не удаляются: проверьте, что хук
wpse_delete_old_orders_eventсрабатывает. Можно вручную вызватьwpse_delete_old_orders()через консоль WP-CLI или временно по URL. - Удаляются не те заказы: проверьте параметры
post_statusиdate_query. Возможно, статусы отличаются, или дата хранится в другом формате. - Удаление занимает слишком много времени: уменьшите
posts_per_pageи разбейте удаление на несколько запусков с использованиемwp_schedule_single_event. - Проблемы с планировщиком WP-Cron: на некоторых серверах WP-Cron не запускается автоматически. Используйте системный cron для вызова
wp-cron.php.
Практические советы по безопасности и производительности
- Перед удалением создайте резервную копию базы данных.
- Настройте функцию удаления так, чтобы не перегружать сервер — используйте порционное удаление.
- Используйте проверку nonce или ограничьте доступ к отладочным функциям, если добавляете вызов через URL.
- Если магазин большой, рассмотрите использование WP-CLI для запуска удаления по расписанию через системный cron. Это надежнее и быстрее.
Сравнение способов автоматического удаления просроченных заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron с PHP-кодом | Легко внедрить, не требует плагинов | Зависит от посещаемости сайта, возможны задержки | Код из статьи |
| WP-CLI + системный cron | Быстро и надёжно, работает независимо от трафика | Требует доступ к серверу и навыков CLI | |
| Плагины очистки | Удобный интерфейс, дополнительные настройки | Дополнительная нагрузка, возможные конфликты | Clearfy Pro (https://wpshop.ru/plugins/clearfy?source=wordpresses.ru&medium=article&campaign=woocommerce-avtomaticheskoe-udaleniye-prosrrochennyh-zaказов-po-raspisaniyu) |