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

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

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

Автоматизация удаления заказов по заданным условиям (например, по статусу и дате создания) помогает:

  • Оптимизировать базу данных;
  • Уменьшить нагрузку на сайт;
  • Поддерживать чистоту и актуальность данных.

Пошаговое решение: PHP-скрипт для удаления заказов по статусу и дате

1. Добавление кастомного Cron-задачи в WordPress

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

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

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

Создадим функцию, которая получает заказы с нужным статусом и датой старше определенного периода, и удаляет их.

function wc_delete_old_orders_by_status_and_date() {
    $statuses_to_delete = array( 'cancelled', 'failed' ); // статусы для удаления
    $days_old = 30; // удалить заказы старше 30 дней

    $date_query = array(
        'column' => 'post_date',
        'before' => date( 'Y-m-d', strtotime("-{$days_old} days") ),
        'inclusive' => true,
    );

    $args = array(
        'status' => $statuses_to_delete,
        'limit' => -1,
        'date_created' => $date_query,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // принудительно удаляем заказ
    }
}
add_action( 'wc_delete_old_orders_daily', 'wc_delete_old_orders_by_status_and_date' );

3. Регистрация интервала для Cron (если нужно)

Если нужно задать собственный интервал запуска, например еженедельно, добавьте фильтр:

add_filter( 'cron_schedules', function( $schedules ) {
    $schedules['weekly'] = array(
        'interval' => 604800, // 7 дней в секундах
        'display'  => __( 'Еженедельно' ),
    );
    return $schedules;
} );

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

  • Зайдите в WooCommerce → Заказы и проверьте наличие заказов со статусом cancelled или failed, созданных более 30 дней назад. Они должны исчезнуть после срабатывания Cron.
  • Для немедленной проверки вызовите функцию вручную через WP-CLI или добавьте временный вызов в functions.php:
wc_delete_old_orders_by_status_and_date();
  • Проверьте размер таблиц wp_posts и wp_postmeta до и после удаления — должно уменьшиться количество заказов.
  • Убедитесь, что заказы действительно удалены, а не переведены в корзину (используем wp_delete_post с параметром true для полного удаления).

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

  • Неверный статус заказа в массиве: используйте только официальные статусы WooCommerce, например pending, processing, failed, cancelled, completed. Ошибки в написании не дадут результата.
  • Отсутствие включенного WP-Cron: если на сервере отключен WP-Cron (define('DISABLE_WP_CRON', true) в wp-config.php), задача не сработает. Решение — настроить системный cron или запускать вручную.
  • Слишком большой объем заказов для удаления: если заказов много, удаление может привести к тайм-ауту. Разбейте удаление на партии, например по 50 заказов за раз.
  • Функция не вызывается: проверьте регистрацию события и при необходимости очистите cron задачи командой wp cron event list и wp cron event delete.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления, чтобы не оставлять мусор в базе.
  • Ограничьте удаление только необходимыми статусами и сроком, чтобы не удалить нужные заказы.
  • В крупных магазинах запускайте удаление в off-peak часы, чтобы не нагружать сервер.
  • Рассмотрите использование плагина Clearfy Pro для дополнительной оптимизации и очистки базы без лишнего кода.
  • Регулярно делайте бэкапы перед автоматическим удалением, чтобы избежать потери данных.

Таблица сравнения способов удаления заказов

МетодПлюсыМинусыРекомендации
Ручное удаление через админкуПросто, не требует кодаДолго, неудобно при большом количестве заказовИспользовать для единичных заказов
PHP-скрипт с Cron (как в статье)Автоматизация, полное удаление, гибкие настройкиТребует базовых навыков разработки, настройка cronЛучше всего для средних и больших магазинов
Плагины для очистки базы (Clearfy, WP-Optimize)Удобный интерфейс, дополнительные функции оптимизацииМожет быть избыточным, влияет на производительностьРекомендуется совместно с кодовыми решениями
Как избежать конфликтов между плагинами в WordPress: практические методы и примеры кода
13.12.2025
Как создать собственный шорткод в WordPress
05.11.2025
Как добавить настройку локализации в плагин WordPress
29.01.2026
Как создать адаптивный сайт на WordPress с помощью media-запросов CSS
20.12.2025
Как удалить дубликаты постов в WordPress
30.11.2025