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

Диагностика проблемы с большим объемом данных в WooCommerce

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

Чтобы понять, насколько сильно база данных раздуты, выполните следующие SQL-запросы в phpMyAdmin или через WP CLI:

-- Количество заказов по статусам
SELECT post_status, COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

-- Количество вариаций товаров
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';

-- Количество метаданных для заказов
SELECT COUNT(*) FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'shop_order');

Обратите внимание на большое количество заказов со статусами, которые можно считать устаревшими (например, cancelled, completed старше 90 дней), а также на вариации товаров, которые не продаются или не используются.

Пошаговое автоматическое удаление старого контента в WooCommerce

1. Удаление старых заказов по статусу и дате

Добавьте следующий код в файл functions.php вашей дочерней темы или в свой плагин с пользовательскими функциями. Этот скрипт удалит заказы со статусами 'cancelled' и 'completed', старше 90 дней, и связанные с ними метаданные.

function wc_delete_old_orders() {
    global $wpdb;
    $statuses_to_delete = ['wc-cancelled', 'wc-completed'];
    $date_threshold = date('Y-m-d H:i:s', strtotime('-90 days'));

    foreach ($statuses_to_delete as $status) {
        // Получаем ID заказов для удаления
        $order_ids = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            $status, $date_threshold
        ));

        if (!empty($order_ids)) {
            foreach ($order_ids as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление
            }
        }
    }
}

// Регистрируем Cron задачу, если еще не зарегистрирована
if (!wp_next_scheduled('wc_delete_old_orders_daily')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_old_orders_daily');
}

add_action('wc_delete_old_orders_daily', 'wc_delete_old_orders');

2. Удаление неактивных вариаций товаров

Неактивные вариации - это вариации, которые не продаются или не имеют атрибутов. Чтобы их удалить, используйте следующий код:

function wc_delete_inactive_variations() {
    global $wpdb;

    // Получаем ID вариаций без атрибутов (пустых метаполей вариаций)
    $variation_ids = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p 
        LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key LIKE 'attribute_%' 
        WHERE p.post_type = 'product_variation' 
        GROUP BY p.ID 
        HAVING COUNT(pm.post_id) = 0"
    );

    if (!empty($variation_ids)) {
        foreach ($variation_ids as $variation_id) {
            wp_delete_post($variation_id, true);
        }
    }
}

// Запускаем после очистки старых заказов
add_action('wc_delete_old_orders_daily', 'wc_delete_inactive_variations');

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

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

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

  • Не удаляются заказы: проверьте, что статусы указаны с префиксом wc- (например, wc-cancelled), иначе запрос не найдет записи.
  • Удаление не происходит по расписанию: убедитесь, что Cron планировщик WordPress работает корректно, нет запретов на выполнение WP-Cron в настройках сервера.
  • Удаляются нужные заказы: всегда тестируйте на копии сайта и корректно задавайте порог по дате, чтобы не потерять актуальные данные.
  • Вариации не удаляются: возможно, у вариаций есть скрытые атрибуты, проверьте метаполя через SQL или используйте расширенный отладчик.

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

  • Для больших баз данных удаление большого количества заказов за один запуск может привести к таймауту. Разбейте удаление на батчи, например, по 50 заказов за раз.
  • Используйте транзакции или создавайте резервные копии базы перед массовым удалением, чтобы избежать потери данных.
  • Оптимизируйте таблицы базы данных после удаления большого количества записей с помощью команды OPTIMIZE TABLE wp_posts, wp_postmeta;.
  • Для улучшения производительности можно дополнительно к удалению старых данных интегрировать плагин Clearfy Pro от WPShop для автоматической чистки дубликатов и оптимизации базы.
  • Не забывайте об ограничении прав доступа к коду удаления - выполняйте эти действия только с правами администратора.

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

МетодПлюсыМинусыКогда использовать
Плагин для очистки WooCommerce Удобство, готовые настройки, поддержка Зависимость от плагина, нагрузка, платные функции Если нужна быстрая настройка без кода
Ручной PHP-код (как в статье) Полный контроль, гибкость, бесплатный Нужны навыки разработки, риски при ошибках Для опытных разработчиков и кастомных задач
SQL-запросы напрямую Самый быстрый способ Риск повредить базу, нет проверки зависимостей Для разовых операций на копии базы
WooCommerce: как автоматически удалять неактивные вариации товаров без плагинов
01.07.2026
Как отключить автоматические обновления в WordPress: подробное руководство
24.02.2026
Как создать автообновляемый кэш в WordPress: практическое руководство
04.11.2025
Автоматический импорт данных из YML в WordPress: практическое руководство
27.01.2026
Как удалить заблокированные пользователи WordPress
18.02.2026