Проблема: накопление неоплаченных заказов в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда неоплаченные заказы (статус "Ожидает оплаты" или "В обработке") накапливаются и засоряют базу данных. Это замедляет работу сайта, усложняет управление заказами и мешает аналитике.
Чтобы автоматизировать очистку, полезно настроить удаление таких заказов через определённое время.
Диагностика проблемы
Для начала проверьте, сколько заказов с неоплаченным статусом у вас в базе:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold');Если число очень большое (сотни или тысячи), это повод для очистки.
Также проверьте, не используются ли эти заказы в отчетах или интеграциях, чтобы избежать потери важных данных.
Пошаговое решение: автоматическое удаление неоплаченных заказов
1. Создаём функцию для удаления заказов старше N дней
Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код:
function er_delete_old_unpaid_orders() {
$days = 7; // число дней для хранения неоплаченных заказов
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-pending', 'wc-on-hold'],
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // true - принудительное удаление
}
}
}2. Запускаем функцию через WP-Cron
Добавьте регистрацию события и планировщик:
// Регистрируем событие, если не зарегистрировано
if (!wp_next_scheduled('er_delete_unpaid_orders_daily')) {
wp_schedule_event(time(), 'daily', 'er_delete_unpaid_orders_daily');
}
// Хук на событие
add_action('er_delete_unpaid_orders_daily', 'er_delete_old_unpaid_orders');Этот код будет запускать удаление старых неоплаченных заказов ежедневно.
Проверка результата
- Выполните SQL-запрос из блока диагностики до и после внедрения, чтобы увидеть уменьшение числа неоплаченных заказов.
- Можно вручную запустить функцию
er_delete_old_unpaid_orders()через WP-CLI или временно добавить вызов вfunctions.phpдля теста. - Проверьте в админке WooCommerce — старые неоплаченные заказы должны исчезнуть.
Частые ошибки и как их исправить
1. Заказы не удаляются
- Проверьте, активирован ли WP-Cron (например, перейдите на страницу
wp-cron.phpи смотрите логи). - Убедитесь, что статус заказа написан правильно — WooCommerce использует префикс
wc-(например,wc-pending). - Проверьте права пользователя, под которым запускается код — функция
wp_delete_postтребует соответствующих прав.
2. Удаляются нужные заказы
- Настройте правильное значение переменной
$days, чтобы не удалять свежие заказы. - Если нужны исключения, добавьте дополнительные условия в запрос.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы перед автоматическим удалением данных.
- Для больших баз данных рекомендуем разбивать удаление на небольшие партии (например, по 100 заказов за раз), чтобы избежать таймаутов.
- Если WP-Cron не надежен на вашем хостинге, настройте системный cron-задание для вызова
wp-cron.php.
Сравнение способов удаления неоплаченных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудозатратно, неэффективно при большом количестве |
| Плагин типа "Cleanup" | Удобно, обычно с настройками | Дополнительная нагрузка, может конфликтовать с другими плагинами |
| Кастомный код с WP-Cron | Гибко, автоматизация, минимальная нагрузка | Требует навыков кодирования, настройка WP-Cron |