Проблема: почему важно удалять неоплаченные заказы в WooCommerce
На крупных интернет-магазинах, работающих на WooCommerce, часто скапливается большое количество неоплаченных заказов. Это замедляет работу админки, увеличивает нагрузку на базу данных и искажает статистику продаж. По умолчанию WooCommerce не удаляет такие заказы автоматически — они остаются в базе навсегда. Чтобы поддерживать чистоту заказов и оптимизировать работу магазина, необходимо внедрить автоматическое удаление заказов, не оплаченных в указанный срок.
Диагностика проблемы неоплаченных заказов
Для начала нужно определить, сколько у вас таких заказов и как давно они создавались. Выполните следующий SQL-запрос в базе данных (через phpMyAdmin или wp-cli):
SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' ORDER BY post_date ASC;Этот запрос покажет все заказы со статусом wc-pending — то есть созданные, но не оплаченные. Если вы видите много таких заказов старше нескольких дней, есть смысл автоматизировать их удаление.
Пошаговое решение: автоматическое удаление заказов, не оплаченных в течение 48 часов
1. Создаем функцию для удаления старых неоплаченных заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpexperts_delete_old_unpaid_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-pending',
'date_query' => array(
array(
'before' => '48 hours ago',
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$orders = get_posts($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удаляем навсегда
}
}2. Настраиваем cron-задачу для регулярного запуска
Добавьте крон-ивент в WordPress, чтобы функция запускалась ежедневно:
function wpexperts_schedule_order_cleanup() {
if (!wp_next_scheduled('wpexperts_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpexperts_daily_order_cleanup');
}
}
add_action('wp', 'wpexperts_schedule_order_cleanup');
add_action('wpexperts_daily_order_cleanup', 'wpexperts_delete_old_unpaid_orders');3. Очистка cron-задачи при деактивации (если используете плагин)
function wpexperts_clear_order_cleanup_cron() {
$timestamp = wp_next_scheduled('wpexperts_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpexperts_daily_order_cleanup');
}
}
// добавить вызов этой функции при деактивации плагинаПроверка результата после внедрения
Чтобы убедиться, что решение работает:
- Создайте тестовый заказ и оставьте его неоплаченным.
- Измените дату создания заказа в базе данных на более чем 48 часов назад (для теста).
- Запустите вручную функцию из консоли WP-CLI:
wp eval 'wpexperts_delete_old_unpaid_orders();'Проверьте, что заказ удалился из списка заказов в админке WooCommerce.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что статус заказа точно
wc-pending— другие статусы не затрагиваются. - Крон-задача не срабатывает: убедитесь, что в WordPress работают крон-задачи (wp-cron). Для отладки используйте плагин WP Crontrol.
- Удаление происходит слишком рано или слишком поздно: скорректируйте параметр
'before' => '48 hours ago'на нужный интервал, например,'24 hours ago'или'72 hours ago'. - Потеря заказов с другим статусом: внимательно проверьте условие выборки, чтобы не затронуть оплаченные, отменённые или в обработке заказы.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($id, true)для полного удаления, если не планируете восстановление заказов. Иначе можно передаватьfalseи удалять в корзину. - Регулярно делайте резервные копии базы данных перед внедрением автоматических удалений.
- Для больших магазинов с тысячами заказов используйте пагинацию в запросе
get_posts, чтобы избежать превышения времени выполнения скрипта. - Можно расширить функционал, отправляя уведомления администратору о количестве удалённых заказов по email.
Сравнение вариантов удаления неоплаченных заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Плагин (например, WooCommerce Cancel Abandoned Order) | Готовое решение с настройками из админки | Простота установки, поддержка | Зависимость от стороннего кода, нагрузка |
| Кастомный код (как в статье) | Полный контроль, лёгкость кастомизации | Минимальная нагрузка, гибкость | Требует навыков, поддержка на вас |
| Ручное удаление через админку | Удаление заказов вручную | Безопасно, не требует кода | Время, риск пропуска старых заказов |