wppartner.ru wordpress WP Partner

WooCommerce: как автоматически удалять отказанные и неактивные заказы

Диагностика проблемы с отказанными и неактивными заказами

В интернет-магазинах на WooCommerce часто скапливаются заказы со статусом «Отказанный платеж» или «Неактивный» (pending, failed), которые не закрываются автоматически. Это приводит к раздутой базе данных, замедлению работы сайта и усложняет управление заказами. Чтобы проверить наличие таких заказов, используйте SQL-запрос к базе данных или смотрите в панели WooCommerce:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-pending');

Если количество таких заказов более сотни, необходимо настроить автоматическое удаление.

Почему WooCommerce не удаляет такие заказы автоматически

WooCommerce по умолчанию не удаляет заказы со статусом отказа или ожидающие платежа, чтобы дать пользователю возможность повторить попытку оплаты или администратору проверить проблему. Но при большом объеме заказов это становится источником проблем.

Пошаговое решение: автоматическое удаление отказанных и неактивных заказов с помощью CRON и хуков

1. Добавление функции для удаления заказов по статусу и времени

Создайте PHP-функцию, которая будет удалять заказы со статусами 'wc-failed' и 'wc-pending', старше определенного времени (например, 7 дней):

function wppartner_delete_old_failed_orders() {
    $args = array(
        'status' => array('failed', 'pending'),
        'date_created' => '<' . ( new WC_DateTime() )->modify('-7 days')->format('Y-m-d H:i:s'),
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);
    if (empty($orders)) {
        return;
    }
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - удаление без перехода в корзину
    }
}

2. Регистрация CRON задачи для периодического запуска

Добавьте CRON-задачу, запускающую функцию раз в сутки:

add_action('wppartner_daily_cleanup', 'wppartner_delete_old_failed_orders');

function wppartner_activate_cron() {
    if (! wp_next_scheduled('wppartner_daily_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wppartner_daily_cleanup');
    }
}
add_action('wp', 'wppartner_activate_cron');

// Для деактивации CRON при деактивации плагина или темы
function wppartner_deactivate_cron() {
    $timestamp = wp_next_scheduled('wppartner_daily_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wppartner_daily_cleanup');
    }
}

3. Добавление уведомлений в админ-панель (опционально)

Чтобы контролировать процесс, можно добавить уведомление в админке с количеством удаленных заказов за последний запуск.

Проверка результата после внедрения

  • Через админку WooCommerce проверьте, что заказы со статусами «Отказанный платеж» и «Ожидает оплаты» старше 7 дней исчезли.
  • Запустите CRON вручную, вызвав хук в консоли WP-CLI: wp cron event run wppartner_daily_cleanup.
  • Проверьте таблицу wp_posts на наличие старых заказов с помощью SQL-запроса из раздела диагностики.

Частые ошибки и как их исправить

  • CRON не запускается: Проверьте, что на сайте включен WP-Cron (в файле wp-config.php нет строки define('DISABLE_WP_CRON', true);). Для надежной работы рекомендуется настроить системный CRON на сервере, который вызывает wp-cron.php.
  • Удаление не происходит: Убедитесь, что используете правильные статусы заказов в функции ('failed', 'pending'), а не их строковые аналоги с префиксом wc- в параметре 'status' функции wc_get_orders.
  • Удаляются нужные заказы: Проверьте условие по дате, чтобы не удалять свежие заказы. Рекомендуется тестировать на копии сайта.

Практические советы по безопасности и производительности

  • Всегда делайте резервную копию базы данных перед автоматическим удалением.
  • Для больших магазинов с тысячами заказов лучше разбивать удаление на пакеты, чтобы не перегружать сервер.
  • Используйте WP-CLI для запуска очистки вручную при необходимости.
  • Мониторьте логи ошибок и уведомления для своевременного реагирования.

Сравнение вариантов реализации автоматического удаления заказов

МетодПлюсыМинусы
Ручное удаление через админПросто, без кодаТрудоемко, не автоматично
Плагин очистки заказовУдобно, готовое решениеДополнительная нагрузка, возможны конфликты
Собственный CRON и функция (код выше)Гибко, без плагинов, под контролемТребует навыков, нужно тестировать
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше