Wordpresses

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

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

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

Проверить количество старых заказов можно через SQL-запрос:

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

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

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

1. Выбор статусов и периода удаления

Определите, какие статусы считать «просроченными» (чаще всего wc-cancelled, wc-failed, wc-pending) и за какой срок (например, 30 дней).

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

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

function wpse_delete_old_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-failed', 'wc-pending'],
        'date_query'     => [
            [
                'column'    => 'post_date',
                'before'    => '30 days ago',
            ],
        ],
        'posts_per_page' => 50, // обрабатываем порциями
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ];

    $old_orders = get_posts($args);

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // принудительно удалить
        }
    }
}

3. Регистрация планировщика задач (wp_cron)

Добавьте регистрацию события:

add_action('wpse_delete_old_orders_event', 'wpse_delete_old_orders');

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

Этот код запускает удаление один раз в сутки.

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

  • Через phpMyAdmin или любой SQL-клиент выполните запрос из раздела диагностики и сравните количество заказов до и после запуска кода.
  • В админ-панели WooCommerce проверьте, что старые заказы исчезли.
  • Для отладки временно замените wp_delete_post($order_id, true); на error_log('Удаляется заказ ID: '.$order_id); и просмотрите логи сервера.

Частые ошибки и способы их исправления

  • Заказы не удаляются: проверьте, что хук wpse_delete_old_orders_event срабатывает. Можно вручную вызвать wpse_delete_old_orders() через консоль WP-CLI или временно по URL.
  • Удаляются не те заказы: проверьте параметры post_status и date_query. Возможно, статусы отличаются, или дата хранится в другом формате.
  • Удаление занимает слишком много времени: уменьшите posts_per_page и разбейте удаление на несколько запусков с использованием wp_schedule_single_event.
  • Проблемы с планировщиком WP-Cron: на некоторых серверах WP-Cron не запускается автоматически. Используйте системный cron для вызова wp-cron.php.

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

  • Перед удалением создайте резервную копию базы данных.
  • Настройте функцию удаления так, чтобы не перегружать сервер — используйте порционное удаление.
  • Используйте проверку nonce или ограничьте доступ к отладочным функциям, если добавляете вызов через URL.
  • Если магазин большой, рассмотрите использование WP-CLI для запуска удаления по расписанию через системный cron. Это надежнее и быстрее.

Сравнение способов автоматического удаления просроченных заказов

МетодПлюсыМинусыПример
WP-Cron с PHP-кодом Легко внедрить, не требует плагинов Зависит от посещаемости сайта, возможны задержки Код из статьи
WP-CLI + системный cron Быстро и надёжно, работает независимо от трафика Требует доступ к серверу и навыков CLI
wp post delete $(wp post list --post_type=shop_order --post_status=wc-cancelled,wc-failed,wc-pending --date_query_column=post_date --before='30 days ago' --format=ids)
Плагины очистки Удобный интерфейс, дополнительные настройки Дополнительная нагрузка, возможные конфликты Clearfy Pro (https://wpshop.ru/plugins/clearfy?source=wordpresses.ru&medium=article&campaign=woocommerce-avtomaticheskoe-udaleniye-prosrrochennyh-zaказов-po-raspisaniyu)
×

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

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

пишет статьи

готовит SEO

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

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