Проблема: накопление неоплаченных заказов в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, особенно с оплатой через банковские переводы или отложенным платежом. Это увеличивает размер базы данных и загромождает админ-панель, затрудняя управление заказами. Стандартных настроек для автоматического удаления таких заказов нет, поэтому потребуется собственное решение.
Диагностика: как понять, что заказы нужно удалять
Прежде чем автоматизировать удаление, нужно понять, какие именно заказы считаются «неоплаченными» и как долго их хранить:
- Статусы заказов: обычно это
pending(ожидает оплаты),failedилиon-hold; - Возраст заказа: например, старше 7 или 14 дней;
- Отсутствие оплаты: нет транзакций или факта оплаты.
Проверить количество таких заказов можно через SQL-запрос к базе данных:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') AND post_date < DATE_SUB(NOW(), INTERVAL 7 DAY);Решение: автоматическое удаление неоплаченных заказов через код
Добавим в файл functions.php или в собственный плагин код, который будет раз в сутки удалять заказы с нужным статусом и старше заданного времени.
1. Создание функции удаления заказов
function wpmagazin_delete_old_unpaid_orders() {
$days = 7; // Удалять заказы старше 7 дней
$statuses = array('wc-pending', 'wc-on-hold');
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'date_query' => array(
array(
'column' => 'post_date',
'before' => "$days days ago",
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
}2. Запуск функции по расписанию через WP-Cron
Добавим ежедневное событие, если его еще нет:
function wpmagazin_schedule_order_cleanup() {
if (!wp_next_scheduled('wpmagazin_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpmagazin_daily_order_cleanup');
}
}
add_action('wp', 'wpmagazin_schedule_order_cleanup');
add_action('wpmagazin_daily_order_cleanup', 'wpmagazin_delete_old_unpaid_orders');Проверка результата после внедрения
- Через базу данных проверьте количество заказов с статусом
wc-pendingи датой старше 7 дней — их должно стать меньше или они должны исчезнуть после первого запуска. - Проверьте логи сервера на наличие ошибок при запуске WP-Cron.
- Для теста можно временно уменьшить период удаления с 7 дней до 1 дня и добавить тестовый заказ.
Частые ошибки и как их исправить
- WP-Cron не срабатывает: если сайт мало посещаемый, WP-Cron может не запускаться. Решение — настроить реальный системный cron на вызов
wp-cron.php. - Заказы не удаляются: убедитесь, что статусы в массиве совпадают с реальными статусами в базе (с префиксом
wc-). - Удаляются нужные заказы: внимательно проверьте условие по дате и статусам, не задавайте слишком широкий диапазон.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($order_id, true)для полного удаления, чтобы не оставлять мусор в базе. - Для большого числа заказов добавьте пагинацию в запрос и удаляйте партиями, чтобы не перегружать сервер.
- Перед удалением можно сохранять резервную копию базы или экспортировать заказы через WooCommerce.
- Ограничьте права на выполнение этого кода только администратору, если запускаете вручную.
Сравнение вариантов реализации автоматического удаления заказов
| Метод | Плюсы | Минусы | Комментарий |
|---|---|---|---|
| Плагин (например, WooCommerce Cleanup) | Простота установки, интерфейс настройки | Может грузить сайт, лишний функционал | Подходит для непрофессионалов |
| Собственный код с WP-Cron | Контроль, легковесность, настройка под себя | Требует знаний, возможны ошибки в логике | Рекомендуется разработчикам |
| Ручное удаление через SQL | Мгновенный эффект | Риск потерять данные, сложность | Опасно без опыта |