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

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

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

Проверить наличие неактивных заказов можно через админку WooCommerce: перейдите в WooCommerce > Заказы и отфильтруйте по нужному статусу (например, «Ожидает оплаты»). Если количество заказов растёт, стоит автоматизировать их удаление.

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

1. Определяем критерии удаления

Чаще всего удаляют заказы со статусом pending (ожидает оплаты) или failed, которые старше определённого количества дней (например, 7 дней). Можно расширить список статусов по бизнес-логике.

2. Добавляем регулярную задачу через WP-Cron

Для автоматизации нужно создать функцию, которая будет удалять старые заказы, и запланировать её вызов по расписанию (например, раз в сутки).

3. Пример кода для functions.php темы или отдельного плагина

<?php
// Регистрация задачи при активации темы/плагина
function wps_delete_old_orders_activation() {
    if ( ! wp_next_scheduled( 'wps_delete_old_orders_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'wps_delete_old_orders_hook' );
    }
}
add_action( 'wp', 'wps_delete_old_orders_activation' );

// Отмена задачи при деактивации
function wps_delete_old_orders_deactivation() {
    $timestamp = wp_next_scheduled( 'wps_delete_old_orders_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wps_delete_old_orders_hook' );
    }
}
register_deactivation_hook( __FILE__, 'wps_delete_old_orders_deactivation' );

// Функция удаления
function wps_delete_old_orders() {
    $days = 7; // количество дней для хранения заказов
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

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

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // true - безвозвратное удаление
    }
}
add_action( 'wps_delete_old_orders_hook', 'wps_delete_old_orders' );
?>

4. Проверка и отладка

Чтобы проверить работу, можно временно уменьшить $days до 0 или 1 и вручную запустить функцию wps_delete_old_orders() через WP-CLI или через временный хук:

do_action('wps_delete_old_orders_hook');

Также можно добавить логирование в файл:

error_log('Удалено заказов: ' . count($orders));

После отладки не забудьте убрать логи и вернуть нужный интервал.

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

  • В админке WooCommerce проверьте список заказов со статусами pending и failed старше 7 дней — они должны отсутствовать.
  • Проверьте базу данных в таблице wp_posts (тип shop_order) — количество таких заказов должно уменьшиться.
  • Можно использовать WP-CLI команду для проверки: wp post list --post_type=shop_order --post_status=pending,failed --date_query_column=post_date --before='7 days ago'

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

  • Неправильный статус заказов в аргументах запроса. Проверьте, что статусы совпадают с теми, которые вы хотите удалить. Например, pending и failed. Другие статусы, например on-hold или processing, удалять не стоит.
  • Отсутствие wp_schedule_event после активации. Функция wps_delete_old_orders_activation может не сработать, если не вызывается при инициализации. Добавьте хук add_action('wp', ...) или используйте register_activation_hook в плагине.
  • Удаление заказов не происходит. Проверьте права пользователя, под которым выполняется код, и убедитесь, что функция wp_delete_post вызывается корректно.
  • Удаление заказов происходит, но не сразу. WP-Cron зависит от посещаемости сайта. Для точности используйте системный cron или WP-CLI для запуска задачи по расписанию.

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

  • Используйте безвозвратное удаление только если уверены, что данные не нужны. Для мягкого удаления замените true на false в wp_delete_post.
  • Если заказов много, делайте удаление пакетами по 20-50 заказов за раз, чтобы не перегружать сервер.
  • Храните резервные копии базы перед автоматическим удалением.
  • Для более точного контроля используйте отдельный пользовательский плагин с регистрацией WP-Cron через register_activation_hook и register_deactivation_hook.
  • Для больших магазинов лучше настроить системный cron, который вызывает WP-CLI команду удаления заказов, например:
wp eval 'wps_delete_old_orders();'

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

МетодПреимуществаНедостатки
WP-Cron с wp_schedule_eventПростота внедрения, не требует серверных настроекЗависит от посещаемости сайта, может работать с задержками
Системный cron + WP-CLIТочная периодичность, высокая надежностьТребуются права доступа к серверу, настройка сложнее
Плагины для очистки базыГотовые решения, удобный интерфейсМогут потреблять ресурсы, не всегда гибкие
Как создать пошаговый социальный канал в WordPress с применением WPRemark
01.03.2026
Как настроить автовывод сообщений в WordPress по расписанию
07.04.2026
Как создать автоматические отзывы в WordPress с помощью плагинов и кода
20.01.2026
Автоматическое добавление новостей из RSS в WordPress без плагинов
21.02.2026
Как отключить AJAX пагинацию в WordPress и заменить на классическую
06.01.2026