WooCommerce: автоматическое удаление неоплаченных заказов по срокам

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

В интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, которые занимают место в базе и могут влиять на аналитику и производительность. Особенно это критично при большом количестве заказов или использовании нестандартных платежных шлюзов, которые не обновляют статус заказа сразу.

Чтобы выявить проблему, проверьте в админке WooCommerce список заказов с статусом pending, on-hold или failed. Если таких заказов много и они не меняют статус длительное время, есть смысл автоматизировать их удаление по истечении заданного срока.

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

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

Добавьте следующий код в файл functions.php вашей дочерней темы или в собственный плагин:

function wpall_delete_old_unpaid_orders() {
    $days_to_keep = 7; // Сколько дней хранить неоплаченные заказы
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_to_keep} days"));

    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'failed', 'on-hold'),
        'date_created' => '<' . $date_threshold,
        'return'       => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - принудительное удаление без корзины
    }
}

2. Подключаем функцию к WP-Cron для регулярного запуска

Добавьте планировщик, чтобы функция запускалась, например, раз в сутки:

if (!wp_next_scheduled('wpall_daily_unpaid_order_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpall_daily_unpaid_order_cleanup');
}

add_action('wpall_daily_unpaid_order_cleanup', 'wpall_delete_old_unpaid_orders');

3. Очистка WP-Cron при деактивации

Если делаете это в плагине, не забудьте убрать задачу при деактивации:

function wpall_deactivate_cleanup() {
    $timestamp = wp_next_scheduled('wpall_daily_unpaid_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpall_daily_unpaid_order_cleanup');
    }
}
register_deactivation_hook(__FILE__, 'wpall_deactivate_cleanup');

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

  • После добавления кода и запуска WP-Cron убедитесь, что заказы старше 7 дней со статусом pending, failed или on-hold удаляются.
  • Для проверки можно временно уменьшить $days_to_keep до 0 или 1 и создать тестовые заказы с нужным статусом и датой.
  • Проверьте журнал ошибок и базу данных, чтобы убедиться, что заказы действительно удалены, а связанные метаданные и записи в таблицах также очищены. WP-функция wp_delete_post удаляет всю связанную с заказом информацию.

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

  • Заказы не удаляются: Проверьте, запущена ли задача WP-Cron. Для сайтов с низкой посещаемостью WP-Cron может не запускаться автоматически — рекомендуется настроить системный cron или использовать плагин WP Crontrol.
  • Удаляются не те заказы: Убедитесь, что в параметре 'status' указаны именно нужные статусы. Если у вас кастомные статусы, добавьте их в массив.
  • Ошибка при удалении: Проверьте права пользователя и наличие ошибок в логах сервера. Возможно, конфликт с плагинами безопасности или кешированием.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления, чтобы избежать накопления мусора в базе.
  • Ограничьте количество заказов, обрабатываемых за один запуск, если база очень большая, чтобы избежать таймаутов. Можно разбить удаление по партиям.
  • Регулярно проверяйте журнал ошибок и логи сервера, чтобы отследить возможные сбои.
  • Для ускорения WP-Cron используйте системный cron, особенно на больших магазинах.

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

МетодПлюсыМинусы
Код в functions.php + WP-Cron Полный контроль, бесплатное решение, гибкость Зависит от WP-Cron, требует базовых навыков PHP
Плагин автоматического удаления заказов Простота установки, готовый интерфейс Может нагружать сайт, ограниченная кастомизация, возможны конфликты
Ручное удаление Контроль за каждым заказом Трудозатратно, риск пропуска старых заказов
⭐⭐⭐⭐⭐