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

Диагностика проблемы накопления старого контента в WooCommerce

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

Чтобы проверить, есть ли у вас «мусор» в базе, выполните SQL-запросы для оценки объема данных:

SELECT post_type, COUNT(*) AS count FROM wp_posts WHERE post_type IN ('shop_order', 'product_variation') GROUP BY post_type;

SELECT COUNT(*) FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts);

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';

Также полезно оценить размер таблиц базы данных через phpMyAdmin или команду SHOW TABLE STATUS.

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

Удаление заказов по статусу и дате без плагинов

Реализуем очистку заказов старше N дней с определенными статусами (например, отменённые, завершённые):

function wc_delete_old_orders() {
    global $wpdb;
    $days = 90; // Удалять заказы старше 90 дней
    $statuses = ['wc-cancelled', 'wc-completed'];

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
    foreach ($statuses as $status) {
        $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
        ));

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

add_action('wp_loaded', 'wc_delete_old_orders');

Эту функцию лучше запускать через WP-Cron раз в сутки, чтобы не нагружать сервер при каждом заходе на сайт.

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

Неактивные вариации — те, у которых нет атрибутов или которые не используются в каталоге. Вот скрипт для их удаления:

function wc_delete_inactive_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_variation_description',
                'compare' => 'NOT EXISTS',
            ],
        ],
    ];

    $variations = get_posts($args);
    foreach ($variations as $variation) {
        $parent_id = wp_get_post_parent_id($variation->ID);
        if (!$parent_id) {
            wp_delete_post($variation->ID, true);
        }
    }
}

add_action('wp_loaded', 'wc_delete_inactive_variations');

Оптимизацию можно расширить удалением ревизий и временных транзиентов.

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

  • Проверьте количество заказов старше установленного порога в админке WooCommerce.
  • Выполните SQL-запросы из раздела диагностики повторно — количество удалённых записей должно уменьшиться.
  • Оцените скорость загрузки страниц админки и фронтенда до и после оптимизации с помощью инструментов типа Query Monitor и GTmetrix.

Частые ошибки при автоматическом удалении и как их исправить

  • Удаление активных заказов: Неправильная проверка статусов может привести к удалению важных заказов. Всегда фильтруйте по корректным статусам, используйте префикс wc-.
  • Ошибки с зависимостями: Не удаляйте вариации без проверки наличия родительского продукта — это приводит к ошибкам и «потерям» данных.
  • Перегрузка сервера: Запуск удаления большого объема данных без разбивки на партии (batch processing) может вызвать тайм-ауты. Используйте WP-Cron или разнесите выполнение по времени.
  • Отсутствие резервной копии: Перед массовым удалением всегда делайте резервную копию базы данных.

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

  • Используйте wp_delete_post($id, true) для полного удаления, чтобы очистить все связанные метаданные.
  • Для регулярной очистки настройте WP-Cron задачу, например:
if (!wp_next_scheduled('wc_daily_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wc_daily_cleanup');
}
add_action('wc_daily_cleanup', 'wc_delete_old_orders');
add_action('wc_daily_cleanup', 'wc_delete_inactive_variations');
  • Проверяйте и очищайте таблицу wp_options от устаревших transient и опций, влияющих на производительность.
  • Для масштабных магазинов рассмотрите использование специализированных плагинов оптимизации, например, Clearfy Pro (https://wpshop.ru/plugins/clearfy), которые автоматизируют очистку и оптимизацию.

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

МетодПлюсыМинусы
Ручной SQL-запросБыстро, без лишнего кодаРиск ошибок, сложно автоматизировать
Код на PHP + WP-CronАвтоматизация, безопасное удаление через API WPТребует навыков программирования
Плагины оптимизацииУдобство, расширенный функционалМогут влиять на производительность, платные опции
WooCommerce: как автоматически удалять старый контент и оптимизировать базу данных
14.07.2026
Как добавить многоуровневое меню в WordPress с помощью кода
13.03.2026
Как создать автообновляемый кэш в WordPress: практическое руководство
04.11.2025
WooCommerce: как автоматически удалять неактивные вариации товаров без плагинов
20.06.2026
WooCommerce: как автоматически удалять неактивные вариации товаров
22.05.2026