Диагностика проблемы с неактивными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются заказы со статусами «ожидает оплаты», «в обработке» или «отменённые», которые остаются висеть длительное время без движения. Это замедляет работу админки, нагружает базу данных и усложняет аналитику.
Проверьте, есть ли у вас такие заказы с помощью SQL-запроса к базе данных:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold', 'wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);Если количество заказов большое и они неактивны, стоит подумать об автоматическом удалении таких записей.
Пошаговое решение: автоматическое удаление неактивных заказов через WP-Cron
1. Создаём функцию для удаления заказов старше 30 дней с определёнными статусами
function wpb_delete_old_inactive_orders() {
global $wpdb;
$statuses = ['wc-pending', 'wc-on-hold', 'wc-cancelled'];
$placeholders = implode(",", array_fill(0, count($statuses), '%s'));
$query = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ($placeholders) AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY)",
...$statuses
);
$order_ids = $wpdb->get_col($query);
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // true - удалить без перемещения в корзину
}
}
}2. Регистрируем WP-Cron задачу для запуска функции раз в сутки
function wpb_schedule_order_cleanup() {
if (!wp_next_scheduled('wpb_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_order_cleanup');
}
}
add_action('wp', 'wpb_schedule_order_cleanup');
add_action('wpb_daily_order_cleanup', 'wpb_delete_old_inactive_orders');3. Опционально: вручную проверить работу функции
add_action('admin_init', function() {
if (isset($_GET['run_order_cleanup'])) {
wpb_delete_old_inactive_orders();
wp_redirect(admin_url());
exit;
}
});После добавления этого кода в файл functions.php вашей темы или в отдельный плагин, заказы с указанными статусами и старше 30 дней будут удаляться автоматически каждый день.
Как проверить, что удаление работает
- В базе данных через phpMyAdmin или аналогичный инструмент выполните SQL-запрос выше и проверьте количество заказов до и после запуска задачи.
- В админке WooCommerce проверьте список заказов — старые неактивные должны исчезать.
- Временно добавьте вызов функции по GET-параметру
?run_order_cleanup, чтобы сразу протестировать удаление.
Частые ошибки и как их исправить
- Задача WP-Cron не запускается: если на сервере мало трафика, WP-Cron может не запускаться автоматически. Решение — настроить системный cron (например,
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron). - Удаляются активные заказы: проверьте статусы в массиве
$statuses, чтобы не включать те, что нужны для текущих продаж. - Память или время выполнения PHP превышены: при большом количестве заказов удаляйте их порциями, добавив лимит в SQL-запрос и повторяя удаление.
Практические советы по оптимизации и безопасности
- Перед удалением сделайте резервную копию базы данных.
- Используйте транзакции или пакетное удаление, чтобы избежать повреждения данных.
- Добавьте логирование удалённых заказов для аудита.
- Расширьте функцию, чтобы удалять и связанные метаданные из таблицы
wp_postmeta.
Сравнение вариантов удаления старых заказов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| WP-Cron + PHP-скрипт (как в статье) | Полный контроль, бесплатно, гибко | Зависит от WP-Cron, может требовать доработок | Малые и средние магазины |
| Плагины для очистки заказов (например, WooCommerce Order Cleanup) | Простая настройка, интерфейс | Может нагружать сайт, не всегда гибко | Быстрое решение без кода |
| SQL-запросы по расписанию через cron на сервере | Максимальная скорость и контроль | Требует навыков DBA и доступа к серверу | Большие проекты с администратором БД |