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

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

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

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

1. Создание функции для удаления старых заказов

Ниже пример кода, который удаляет заказы со статусом cancelled и failed, а также неоплаченные заказы со статусом pending, которые старше 7 дней:

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

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

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            $order->delete(true); // Удаляем заказ полностью
        }
    }
}

2. Добавление задачи в WP-Cron для регулярного запуска

Чтобы функция выполнялась автоматически, зарегистрируем событие в WP-Cron, которое будет запускать удаление заказов ежедневно:

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

add_action('wpcoder_daily_delete_old_orders', 'wpcoder_delete_old_wc_orders');

3. Размещение кода в плагине или functions.php темы

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

<?php
/**
 * Plugin Name: WooCommerce Auto Delete Old Orders
 * Description: Удаляет неоплаченные и отменённые заказы старше 7 дней.
 * Version: 1.0
 * Author: WPCoder.ru
 */

add_action('init', function() {
    if (!wp_next_scheduled('wpcoder_daily_delete_old_orders')) {
        wp_schedule_event(time(), 'daily', 'wpcoder_daily_delete_old_orders');
    }
});

add_action('wpcoder_daily_delete_old_orders', 'wpcoder_delete_old_wc_orders');

function wpcoder_delete_old_wc_orders() {
    $days = 7;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $args = array(
        'status' => array('pending', 'cancelled', 'failed'),
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            $order->delete(true);
        }
    }
}

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

  • В админке WooCommerce перейдите в раздел «Заказы» и проверьте наличие старых заказов со статусом pending, cancelled, failed.
  • Запустите вручную функцию, добавив временный вызов: wpcoder_delete_old_wc_orders(); в functions.php, чтобы проверить удаление.
  • Проверьте в базе данных таблицу wp_posts (тип записи shop_order), что старые заказы удалены.
  • Убедитесь, что WP-Cron запланирован: в плагине WP Crontrol или через команду WP-CLI wp cron event list.

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

  • Код не запускается регулярно: проверьте, что WP-Cron работает, на сайтах с низкой посещаемостью cron может не запускаться. Используйте системный cron для вызова wp-cron.php.
  • Удаление заказов не происходит: возможно, статус заказа не совпадает с указанными. Проверьте, какие статусы используются на вашем сайте, например, через wc_get_order_statuses().
  • Удаляются нужные заказы: будьте осторожны с условиями даты и статусами, настраивайте фильтр под свои нужды, чтобы не потерять важные данные.
  • Ошибка «функция wc_get_orders не найдена»: убедитесь, что WooCommerce активен, и код запускается после инициализации плагина (например, на хуке init).

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

  • Для больших магазинов с тысячами заказов используйте пагинацию при выборке заказов, чтобы избежать перегрузки памяти.
  • Перед удалением заказов можно создавать резервные копии базы данных или экспортировать данные заказов.
  • В случаях необходимости сохранять историю — используйте архивирование, например, переносите старые заказы в отдельную таблицу.
  • Отключайте WP-Cron и настраивайте системный cron на серверах с низкой посещаемостью для надёжности.

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

МетодПлюсыМинусы
Плагин (например, WP Clear Orders)Простота установки, готовый интерфейсМожет быть избыточным, нагрузка на сайт
Код в functions.phpПолный контроль, нет лишних функцийТребует знаний, возможны ошибки при обновлениях темы
Отдельный плагин с кастомным кодомБезопасно, сохраняется при обновленияхНужно создавать и поддерживать
Как массово удалить мета-ключи в WordPress
01.03.2026
Автоматизация создания и удаления пользовательских метаполей в WordPress
10.04.2026
WooCommerce: как автоматически удалять неоплаченные заказы по срокам
13.06.2026
Как использовать WP-CLI для автоматизации WordPress
04.12.2025
Как создать автоматический импорт постов по RSS в WordPress
05.02.2026