Как удалить старые варианты товаров WooCommerce без плагинов

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

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

Как определить устаревшие варианты

  • Вариации, не связанных с активными товарами (продуктов без статуса "publish").
  • Вариации с датой создания/обновления старше определенного периода (например, 1 год).
  • Вариации с нулевым количеством и без заказов.

Для диагностики можно использовать SQL-запросы к таблицам wp_posts и wp_postmeta с фильтрацией по типу product_variation.

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

Мы напишем безопасный скрипт, который удалит вариации товаров по заданному условию (например, старше 1 года и без заказов).

<?php
function delete_old_woocommerce_variations() {
    $args = array(
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'date_query'     => array(
            'before' => '1 year ago',
        ),
        'fields'         => 'ids',
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => '0',
                'compare' => '=',
            ),
        ),
    );

    $variations = get_posts($args);

    foreach ($variations as $variation_id) {
        // Проверяем, есть ли заказы для вариации
        global $wpdb;
        $order_count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}woocommerce_order_items oi 
             JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
             WHERE oim.meta_key = '_variation_id' AND oim.meta_value = %d",
            $variation_id
        ));

        if (!$order_count) {
            wp_delete_post($variation_id, true); // Безвозвратное удаление
        }
    }
}

// Запускаем функцию при активации темы или вручную
add_action('init', 'delete_old_woocommerce_variations');
?>

Обратите внимание, что wp_delete_post с флагом true удаляет пост без помещения в корзину.

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

  • Зайдите в админку WooCommerce > Товары > Вариации, проверьте количество оставшихся вариаций.
  • Для контроля можно сделать SQL-запрос: SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation'; до и после.
  • Проверьте работоспособность сайта и корректность отображения продуктов с вариациями.

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

  • Удаляются активные вариации: Проверьте условия фильтрации, не используйте слишком общие критерии.
  • Функция не запускается: Убедитесь, что хук init сработал, или запустите функцию вручную через WP-CLI.
  • Удаление не происходит из-за прав доступа: Проверьте, что код работает с правами администратора и вызов функции происходит в безопасном контексте.

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

  • Перед запуском сделайте полный бэкап базы данных.
  • Запускайте удаление в off-peak время, чтобы не нагружать сервер при пиковых нагрузках.
  • Если вариантов очень много, реализуйте удаление партиями с помощью WP_Query с пагинацией.
  • Для больших сайтов используйте WP-CLI скрипты для более эффективного управления.

Сравнение подходов удаления старых вариаций WooCommerce

Метод Плюсы Минусы Пример
Удаление вручную через админку Простота, отсутствие кода Длительно, неудобно при большом количестве Админка WooCommerce > Вариации
Использование плагинов Автоматизация, интерфейс Нагрузка, лишние зависимости Плагины очистки WooCommerce
Код на PHP (как в статье) Контроль, нет зависимостей Требует знаний, риск ошибок Код с wp_delete_post
Как настроить AJAX в WordPress для динамического обновления контента
18.11.2025
Как настроить автоматическое удаление неиспользуемых медиафайлов в WordPress
13.02.2026
Как удалить пустые теги в WordPress: эффективные методы
15.04.2026
Как добавить поддержку виджетов Gutenberg в собственную тему WordPress
08.01.2026
Как удалить пустые категории в WordPress с помощью кода
21.03.2026