Диагностика проблемы: зачем удалять неоплаченные заказы в WooCommerce
На WooCommerce-сайтах со временем накапливаются неоплаченные заказы, которые занимают место в базе данных и могут создавать путаницу в админке. Особенно это актуально для магазинов с высокой посещаемостью и большим количеством брошенных корзин. Удаление таких заказов вручную неудобно и требует постоянного контроля.
Типичная задача — автоматически очищать неоплаченные заказы, которые не были оплачены в течение определённого времени (например, 24 часа).
Как определить неоплаченные заказы для удаления
В WooCommerce неоплаченные заказы обычно имеют статус pending (ожидание оплаты) или failed (отказ платежа). Можно ориентироваться на дату создания заказа — если прошло больше 24 часов, заказ можно считать устаревшим и удалить.
Для проверки в базе данных заказы имеют тип записи shop_order и хранятся в таблице wp_posts (префикс может отличаться).
Пошаговое решение: автоматическое удаление неоплаченных заказов с помощью WP-Cron
1. Создаём функцию для удаления заказов
function wpcourse_delete_old_unpaid_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => '24 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); // Полное удаление без перемещения в корзину
}
}2. Регистрируем WP-Cron событие для ежедневного запуска
function wpcourse_schedule_order_cleanup() {
if (!wp_next_scheduled('wpcourse_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpcourse_daily_order_cleanup');
}
}
add_action('wp', 'wpcourse_schedule_order_cleanup');
add_action('wpcourse_daily_order_cleanup', 'wpcourse_delete_old_unpaid_orders');3. Как добавить код в сайт
Лучше всего помещать этот код в файл functions.php активной темы или в отдельный кастомный плагин, чтобы избежать потери при обновлениях темы.
Проверка результата после внедрения
- Создайте тестовый заказ с статусом
pendingилиfailedстарше 24 часов (можно вручную изменить дату в базе для теста). - Запустите WP-Cron вручную с помощью плагина WP Crontrol или дождитесь автоматического запуска в полночь.
- Убедитесь, что заказ удалился из админки WooCommerce и таблицы
wp_posts. - Проверьте логи сайта на ошибки, если заказ не удалился.
Частые ошибки и как их исправить
- Заказы не удаляются: Возможно, WP-Cron не запускается. Проверьте работу Cron, запустите вручную через WP Crontrol или настройте системный Cron.
- Удаляются нужные заказы: Проверьте временные рамки в
date_queryи статусы заказов. - Ошибки прав доступа: Убедитесь, что функция
wp_delete_postвызывается с параметромtrueдля полного удаления и что у пользователя, под которым выполняется код, есть права на удаление заказов.
Практические советы по безопасности и производительности
- Запускайте удаление заказов не чаще одного раза в сутки, чтобы не нагружать базу.
- Перед удалением заказов можно создать резервную копию базы данных, особенно на живом магазине.
- Для сайтов с большим количеством заказов ограничьте выборку в
get_postsи запускайте удаление частями, чтобы избежать таймаутов. - Запретите удаление заказов с важными статусами (например,
processing,completed), чтобы не потерять данные.
Сравнение: плагин vs код для удаления неоплаченных заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, WooCommerce Order Cleanup) | Простая настройка, поддержка интерфейса, регулярные обновления | Дополнительная нагрузка, возможные конфликты, может быть платным |
| Код (WP-Cron + wp_delete_post) | Лёгкий, настраиваемый, без лишних плагинов, полный контроль | Нужны базовые знания PHP, самостоятельное тестирование и поддержка |