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

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

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

Проверьте текущие статусы заказов, выполнив SQL-запрос или используя функции WooCommerce для получения списка статусов:

global $order_statuses;
print_r(wc_get_order_statuses());

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

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

1. Определяем, какие статусы считаются "старыми"

Для примера — удалим статусы, которые не использовались более 90 дней.

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

WooCommerce не хранит статусы заказов в отдельной таблице, а использует пользовательские статусы как taxonomy. Чтобы удалить статус, нужно вручную удалить все заказы с этим статусом или изменить их статус, а затем убрать регистрацию статуса.

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

function remove_old_order_statuses() {
    $days_limit = 90;
    $cutoff = strtotime("-" . $days_limit . " days");
    
    $statuses = wc_get_order_statuses();
    
    foreach ($statuses as $status_key => $status_label) {
        if (strpos($status_key, 'wc-custom-') !== false) { // Фильтр для кастомных статусов
            $args = [
                'limit' => -1,
                'status' => $status_key,
                'date_modified' => '<' . date('Y-m-d', $cutoff),
                'return' => 'ids',
            ];
            $orders = wc_get_orders($args);
            
            if (!empty($orders)) {
                foreach ($orders as $order_id) {
                    $order = wc_get_order($order_id);
                    // Переводим заказ в статус 'wc-completed'
                    $order->update_status('completed', 'Автоматическое обновление статуса');
                }
                // После переноса заказов можно удалить регистрацию статуса в вашем плагине/темe
                // Например, удалить хук add_action('init', 'register_custom_status');
            }
        }
    }
}
add_action('wp_loaded', 'remove_old_order_statuses');

Обратите внимание, что удаление регистрации статуса вручную — это задача разработчика темы или плагина, где добавлен кастомный статус.

3. Автоматизация через WP-Cron

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

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

add_action('remove_old_order_statuses_cron_hook', 'remove_old_order_statuses');

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

  • В админке WooCommerce в разделе заказов проверьте, что заказы с указанными старыми статусами переведены в новый статус.
  • Выполните print_r(wc_get_order_statuses()); — старые кастомные статусы не должны отображаться, если их регистрация удалена.
  • Проверьте логи сервера и WooCommerce на наличие ошибок.
  • Проверьте, что WP-Cron успешно запускается (например, с помощью плагина WP Crontrol).

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

  • Статусы не удаляются из списка: причина — статусы продолжают регистрироваться в теме или плагине, нужно найти и удалить регистрацию через register_post_status.
  • Заказы не переводятся в новый статус: неправильный ключ статуса или заказ заблокирован другим плагином, проверьте статус и права доступа.
  • WP-Cron не запускается: отсутствие посещений сайта, настройте системный Cron для запуска WP-Cron.

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

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

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

МетодПлюсыМинусы
Удаление через плагин (например, Clearfy Pro)Простота, интерфейс, безопасностьЗависимость от плагина, нагрузка
Код в functions.php или плагинеГибкость, контроль, отсутствие сторонних зависимостейТребует навыков, риски ошибок
Ручное удаление через базу данныхМаксимальный контрольВысокий риск, требует опытного администратора
Как создать автоматический импорт данных в WordPress без плагинов
01.04.2026
Как использовать WPRemark для автоматического отзыва на сайте WordPress
22.03.2026
Использование WooCommerce хуков для динамического изменения цен товаров
22.04.2026
Решение проблемы остановки записи при массовом импорте в WordPress
09.12.2025
Как исправить ошибку 'wp_temp' при работе с временными таблицами в WordPress
29.12.2025