wppartner.ru wordpress WP Partner

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

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

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

Что считать неактивным заказом

Обычно под неактивными понимают заказы со статусами pending, failed, cancelled, которые не изменялись долгое время (например, более 7 дней). Важно не удалять заказы с оплатой или обработкой.

Как проверить наличие неактивных заказов

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') AND post_date < NOW() - INTERVAL 7 DAY;

Эта команда SQL покажет заказы, подходящие под критерии удаления.

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

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

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

function wppartner_delete_inactive_orders() {
    $days = 7; // количество дней неактивности
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'failed', 'cancelled'),
        'date_created' => '<' . $date,
    );

    $orders = wc_get_orders($args);

    foreach ( $orders as $order ) {
        $order->delete(true); // true - удаляет полностью, включая метаданные
    }
}

2. Настраиваем CRON-задачу для регулярного запуска

Добавьте хук, который запустит функцию ежедневно:

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

add_action( 'wppartner_daily_delete_inactive_orders', 'wppartner_delete_inactive_orders' );

3. Ручной запуск и тестирование

Для проверки работы запустите вручную:

wppartner_delete_inactive_orders();

Или выполните в консоли WP-CLI:

wp eval 'wppartner_delete_inactive_orders();'

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

Проверьте базу заказов через админку WooCommerce — неактивных заказов должно стать меньше или они исчезнут. Также можно выполнить SQL-запрос из раздела диагностики, чтобы убедиться, что старые заказы удалены.

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

  • Не удаляются заказы: проверьте, что статусы заказов указаны корректно с префиксом wc- (например, wc-pending). В wc_get_orders нужно указывать без префикса, как в примере выше.
  • CRON-задача не выполняется: убедитесь, что WP-Cron включен и работает. Для теста запустите wp cron event run --due-now через WP-CLI.
  • Удаляются важные заказы: внимательно настройте фильтр по датам и статусам, чтобы не затронуть обработанные заказы.

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

  • Всегда делайте резервную копию базы данных перед внедрением автоматических удалений.
  • Используйте параметр limit при большом количестве заказов, чтобы удалять партиями (например, по 100), чтобы не создавать нагрузку.
  • Для сайтов с большим трафиком и базой используйте системный CRON вместо WP-Cron для надежности.
  • Логируйте удаляемые заказы в файл для аудита:
function wppartner_delete_inactive_orders() {
    $days = 7;
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
    $args = array(
        'limit'  => -1,
        'status' => array('pending', 'failed', 'cancelled'),
        'date_created' => '<' . $date,
    );
    $orders = wc_get_orders($args);
    $log_file = __DIR__ . '/deleted_orders.log';
    foreach ( $orders as $order ) {
        $id = $order->get_id();
        $date_created = $order->get_date_created()->date('Y-m-d H:i:s');
        $order->delete(true);
        file_put_contents($log_file, "Deleted order ID: $id, Date: $date_created\n", FILE_APPEND);
    }
}

Сравнение методов удаления неактивных заказов

МетодПлюсыМинусы
Удаление через WP-Cron (как в статье)Автоматизация, не требует внешних сервисовЗависит от посещаемости сайта, нагрузка при большом количестве заказов
Системный CRON + WP-CLIНадежность, можно запускать в оптимальное времяТребует SSH доступа и навыков работы с сервером
Плагины очистки базыПростота настройки, интерфейсРиск удаления лишнего, нагрузка на сайт, зависимость от обновлений плагина
×
-15%
на премиум плагин
Clearfy

Защитите сайт!

Включить Clearfy »