Диагностика проблемы: зачем удалять неоплаченные заказы автоматически
Неоплаченные заказы в WooCommerce со временем накапливаются в базе, что замедляет работу сайта и усложняет управление заказами. Если магазин не использует ручную очистку, база данных разрастается, а отчёты и админка загромождаются. Автоматизация удаления таких заказов решает эти проблемы.
Как работает удаление заказов в WooCommerce
Заказы в WooCommerce — это тип записи shop_order с метаданными, где есть статус заказа. Неоплаченные заказы обычно имеют статус pending или failed. Удаление таких заказов вручную возможно через админку, но для автоматизации нужен код, который по расписанию будет искать и удалять их.
Почему нельзя просто удалить все заказы с статусом pending
Важна проверка времени создания заказа, т.к. свежие pending-ордера ещё могут быть актуальны. Обычно удаляют заказы старше 24 часов.
Пошаговое решение: удаление неоплаченных заказов через кастомный хук и cron
1. Создаём функцию удаления по статусу и времени
function wptask_delete_old_unpaid_orders() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-pending', 'wc-failed'],
'date_query' => [
[
'column' => 'post_date',
'before' => '24 hours ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$orders = get_posts($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — без перемещения в корзину
}
}
2. Регистрируем кастомный хук для cron
add_action('wptask_cron_delete_unpaid_orders', 'wptask_delete_old_unpaid_orders');
3. Добавляем событие в cron, если его ещё нет
function wptask_schedule_unpaid_orders_cron() {
if (!wp_next_scheduled('wptask_cron_delete_unpaid_orders')) {
wp_schedule_event(time(), 'hourly', 'wptask_cron_delete_unpaid_orders');
}
}
add_action('wp', 'wptask_schedule_unpaid_orders_cron');
4. Очищаем планировщик при деактивации плагина или темы
function wptask_clear_unpaid_orders_cron() {
$timestamp = wp_next_scheduled('wptask_cron_delete_unpaid_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wptask_cron_delete_unpaid_orders');
}
}
register_deactivation_hook(__FILE__, 'wptask_clear_unpaid_orders_cron');
Проверка результата: как убедиться, что удаление работает
- Перейдите в админку WooCommerce → Заказы и отфильтруйте по статусу
Ожидает оплатыилиFailed. - Запустите вручную функцию через
wp shellили вставьте вызовwptask_delete_old_unpaid_orders();вfunctions.phpи обновите сайт. - Проверьте, что заказы старше 24 часов исчезли.
- Посмотрите в таблице
wp_posts, что записи с такими статусами и датой старше 24 часов удалены.
Частые ошибки и их исправление
- Функция не вызывается по расписанию: проверьте, что cron запускается на сервере. По умолчанию WP-Cron работает при заходе на сайт. Для более надёжной работы настройте системный cron на вызов
wp-cron.php. - Статусы заказов указаны неверно: используйте префикс
wc-для статусов, например,wc-pending, иначе WP не найдёт нужные заказы. - Удаление не происходит из-за прав доступа: убедитесь, что код выполняется с достаточными правами и что в
wp_delete_postпередан параметрtrueдля принудительного удаления. - Удаляется лишнее: всегда фильтруйте по дате, чтобы не удалить свежие заказы.
Практические советы по производительности и безопасности
- Для магазинов с очень большим количеством заказов используйте пагинацию при выборке заказов, чтобы не перегружать память. Например, обрабатывать по 100 заказов за раз.
- Добавьте логирование удалённых заказов, чтобы при необходимости восстановить информацию.
- Настройте системный cron на сервере для вызова
wp-cron.phpраз в 5-10 минут, чтобы обеспечить стабильную работу задач. - Перед удалением можно добавить проверку, что заказ не был оплачен после создания, используя мета или статус.
Сравнение вариантов удаления неоплаченных заказов
| Метод | Плюсы | Минусы | Рекомендуемое применение |
|---|---|---|---|
| Удаление через WP-Cron и кастомный хук | Гибкость, автоматизация, точная настройка по статусу и времени | Зависимость от посещаемости сайта, требует настройки cron | Средние и крупные магазины с нестабильным трафиком |
| Плагины для очистки заказов | Простота установки, готовый функционал | Могут быть избыточны, влиять на производительность | Малые магазины, где нет возможности писать код |
| Ручное удаление в админке | Контроль над каждым заказом | Трудозатратно, не автоматизировано | Магазины с малым количеством заказов |