wp-lessons.ru wordpress WP-Lessons

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

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

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

Если не проводить регулярную чистку, то WooCommerce начинает потреблять больше ресурсов, а операции, связанные с вариациями (фильтры, поиск, изменение цен), выполняются медленнее.

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

Неактивные вариации — это вариации, которые:

  • имеют статус private или draft (не опубликованы);
  • не имеют продаж за заданный период (например, 6 месяцев);
  • не используются в заказах и не имеют остатков на складе;
  • не отображаются в каталоге (имеют мета-данные, отключающие показ).

Для определения таких вариаций понадобится анализ метаданных товаров и заказов.

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

Ниже пример рабочего PHP-кода, который можно добавить в functions.php темы или создать отдельный файл для запуска через WP-CLI. Скрипт удаляет вариации без продаж и без остатков за последние 180 дней.

<?php
function wc_delete_inactive_variations( $days = 180 ) {
    global $wpdb;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Получаем ID вариаций, у которых не было заказов после даты
    $variations_to_check = $wpdb->get_col( "
        SELECT p.ID FROM {$wpdb->posts} p
        WHERE p.post_type = 'product_variation'
    " );

    foreach ( $variations_to_check as $variation_id ) {
        // Проверяем, были ли продажи вариации после даты
        $has_recent_order = $wpdb->get_var( $wpdb->prepare( 
            "SELECT COUNT(oi.order_item_id) FROM {$wpdb->prefix}woocommerce_order_items oi
            INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
            INNER JOIN {$wpdb->posts} o ON o.ID = oi.order_id
            WHERE oi.order_item_type = 'line_item'
            AND oim.meta_key = '_variation_id'
            AND oim.meta_value = %d
            AND o.post_date > %s
            AND o.post_status IN ('wc-completed','wc-processing','wc-on-hold')
            ", $variation_id, $date_threshold ) );

        if ( $has_recent_order ) {
            continue; // Есть продажи - пропускаем
        }

        // Проверяем остаток на складе вариации
        $stock = get_post_meta( $variation_id, '_stock', true );
        if ( !empty($stock) && intval($stock) > 0 ) {
            continue; // Есть остаток - пропускаем
        }

        // Удаляем вариацию
        wp_delete_post( $variation_id, true );
    }
}

// Запуск с удалением вариаций без продаж и остатков за 180 дней
add_action( 'init', function() {
    if ( is_admin() && isset($_GET['delete_inactive_variations']) && current_user_can('manage_woocommerce') ) {
        wc_delete_inactive_variations(180);
        echo 'Удаление неактивных вариаций завершено';
        exit;
    }
} );
?>

Для запуска перейдите в админке по URL: https://ваш-сайт.ru/wp-admin/?delete_inactive_variations=1 (подставьте свой домен). Скрипт выполнится и удалит все вариации без продаж и остатков за последние 180 дней.

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

  • В админке WooCommerce откройте список вариаций и убедитесь, что неактивные вариации удалены.
  • Проверьте базу данных в таблице wp_posts для post_type = 'product_variation' — количество строк уменьшилось.
  • Убедитесь, что в новых заказах не появляются удалённые вариации.
  • Проверьте на фронтенде, что отсутствуют пустые или неиспользуемые варианты выбора у товаров.

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

  • Скрипт ничего не удаляет: проверьте, что вы запускаете с правильными правами (админ, manage_woocommerce), и что есть вариации без заказов и остатков.
  • Удаляются нужные вариации: внимательно настраивайте условие времени и проверку остатков. Для большей безопасности делайте резервную копию базы.
  • Ошибки выполнения из-за таймаута PHP: если вариаций много, запускайте скрипт через WP-CLI или делайте удаление частями, добавляя пагинацию.
  • Потеря данных: отключайте удаление с флагом wp_delete_post($id, true) — true означает удаление без возможности восстановления. Можно заменить на false для отправки в корзину.

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

  • Перед запуском скрипта сделайте полную резервную копию базы данных.
  • Для магазинов с большим количеством товаров и заказов используйте WP-CLI для пакетного удаления, чтобы избежать таймаутов.
  • Добавьте логирование удалённых вариаций в отдельный файл для контроля и отката при необходимости.
  • Периодически запускайте скрипт по CRON (через WP-Cron или системный CRON) для автоматической чистки.
  • Если вы используете плагин Clearfy Pro, можете дополнительно оптимизировать базу данных и удалить мусорные метаданные, чтобы ускорить работу WooCommerce.

Сравнение методов удаления неактивных вариаций

МетодПреимуществаНедостатки
Ручное удаление в админкеПростота, безопасностьЗатратно по времени при большом количестве вариаций
Скрипт на PHP (как выше)Автоматизация, точечное удалениеНужны базовые навыки разработки, риск ошибок
Плагины очистки WooCommerceУдобство, дополнительные функцииМогут замедлять сайт, лишний код
×
Сайт, который вау!
-15%

на премиум-тему
JournalX для WordPress

Хватай промо и действуй ⋙