wpdebug.ru wordpress WP Debug

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

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

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

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

Для начала нужно понять, сколько заказов в статусах "отменён" (cancelled), "ожидание оплаты" (pending) и "обработка" (processing), которые не продвигаются дальше, и с какого времени они не обновлялись.

Для этого можно выполнить SQL-запрос напрямую в базе данных (phpMyAdmin или консоль MySQL):

SELECT post_status, COUNT(*) as count
FROM wp_posts
WHERE post_type = 'shop_order'
  AND post_status IN ('wc-pending', 'wc-cancelled', 'wc-failed')
GROUP BY post_status;

Также удобно использовать WP-CLI для подсчёта:

wp post list --post_type=shop_order --post_status=wc-pending,wc-cancelled,wc-failed --format=count

Если количество таких заказов значительное и они не обновлялись длительное время (например, более 30 дней), можно переходить к автоматическому удалению.

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

Для удаления старых заказов в определённых статусах реализуем кастомный cron-задачу с помощью PHP-кода в functions.php или в собственном плагине.

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

function wpdebug_delete_old_unpaid_orders() {
    $days = 30; // удалять заказы старше 30 дней
    $statuses = array('wc-pending', 'wc-cancelled', 'wc-failed');

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => $statuses,
        'date_query' => 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); // true - без перемещения в корзину
        }
    }
}

2. Добавление WP-Cron задачи

add_action('wpdebug_delete_old_orders_hook', 'wpdebug_delete_old_unpaid_orders');

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

3. Очистка cron при деактивации плагина

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

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

Для проверки работы скрипта:

  • Запустите вручную функцию через wp shell или временно вызовите её в шаблоне: wpdebug_delete_old_unpaid_orders();
  • Проверьте, что заказы со статусами и датой старше 30 дней удалены из таблицы wp_posts.
  • Просмотрите логи сервера на наличие ошибок.
  • Через 24 часа убедитесь, что cron-задача сработала (например, с помощью плагина WP Crontrol).

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

  • Неверный статус заказов: статус в базе имеет префикс wc-, например, wc-pending, а не просто pending. Без этого функция не найдёт заказы.
  • Отсутствие прав на удаление заказов: убедитесь, что код выполняется с достаточными правами, особенно если используете кастомные роли.
  • WP-Cron не запускается: на некоторых серверах cron-задания не срабатывают без посещения сайта. Используйте системный cron для вызова wp-cron.php или плагин WP Crontrol для диагностики.

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

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

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

МетодПлюсыМинусыПример
Плагин (например WooCommerce Cleanup) Удобство, графический интерфейс, безопасность Может быть избыточным, нагрузка на сайт, лицензия Clearfy Pro
Кастомный код с WP-Cron Точный контроль, лёгкость настройки, без лишних функций Требует навыков, возможны ошибки в коде Пример из статьи
Ручное удаление через WP-CLI Быстро, подходит для больших объёмов Риск при ошибке, требует доступа к серверу
wp post delete $(wp post list --post_type=shop_order --post_status=wc-pending --date_query_before="30 days ago" --field=ID)
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее