wpcat.ru wordpress WPCat.ru

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

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

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

Как выявить пустые варианты товаров

  • Откройте карточку товара с вариациями в админке WooCommerce.
  • Проверьте наличие вариаций без цены или с пустым SKU.
  • Используйте SQL-запрос для поиска вариаций без метаданных цены и SKU:
SELECT p.ID FROM wp_posts p
LEFT JOIN wp_postmeta pm_price ON p.ID = pm_price.post_id AND pm_price.meta_key = '_price'
LEFT JOIN wp_postmeta pm_sku ON p.ID = pm_sku.post_id AND pm_sku.meta_key = '_sku'
WHERE p.post_type = 'product_variation' AND (pm_price.meta_value IS NULL OR pm_price.meta_value = '') AND (pm_sku.meta_value IS NULL OR pm_sku.meta_value = '');

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

В WooCommerce атрибуты хранятся в wp_terms и связаны с товарами через таксономии pa_{slug}. Для проверки неиспользуемых атрибутов воспользуйтесь SQL-запросом:

SELECT t.term_id, t.name FROM wp_terms t
LEFT JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
LEFT JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy LIKE 'pa_%' AND tr.object_id IS NULL;

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

Реализуем функцию, которую можно добавить в functions.php вашей темы или в собственный плагин, чтобы автоматически удалять пустые варианты и неиспользуемые атрибуты.

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

function wc_delete_empty_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
    ];
    $variations = get_posts($args);

    foreach ($variations as $variation) {
        $price = get_post_meta($variation->ID, '_price', true);
        $sku   = get_post_meta($variation->ID, '_sku', true);

        if (empty($price) && empty($sku)) {
            wp_delete_post($variation->ID, true);
        }
    }
}

Шаг 2. Удаление неиспользуемых атрибутов

function wc_delete_unused_attributes() {
    global $wpdb;
    
    $taxonomies = $wpdb->get_col("SELECT DISTINCT taxonomy FROM {$wpdb->term_taxonomy} WHERE taxonomy LIKE 'pa_%'");

    foreach ($taxonomies as $taxonomy) {
        $terms = get_terms([
            'taxonomy'   => $taxonomy,
            'hide_empty' => false,
        ]);

        foreach ($terms as $term) {
            $count = $term->count;
            if ($count === 0) {
                wp_delete_term($term->term_id, $taxonomy);
            }
        }
    }
}

Шаг 3. Запуск функций по Cron или вручную

Для регулярного запуска автоматизации подключите функции к Cron или запускайте вручную из админки через AJAX или WP-CLI:

// Пример вызова вручную
add_action('admin_init', function() {
    if (isset($_GET['clean_wc'])) {
        wc_delete_empty_variations();
        wc_delete_unused_attributes();
        echo 'Очистка WooCommerce завершена';
        exit;
    }
});

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

После запуска скриптов проверьте:

  • В админке WooCommerce больше нет товаров с пустыми вариантами (без цены и SKU).
  • В разделе «Атрибуты» отсутствуют термины с нулевым счетчиком использования.
  • В базе данных не осталось записей с пустыми вариантами и неиспользуемыми атрибутами (по SQL-запросам из раздела диагностики).

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

  • Ошибка удаления вариаций: варианты не удаляются из-за зависимостей или неправильных прав доступа. Проверьте, что функция вызывается с правами администратора и нет ограничений хостинга.
  • Удаляются нужные варианты: проверьте логику условия удаления, не удаляйте варианты с ценой или SKU, даже если они пусты.
  • Атрибуты не удаляются: убедитесь, что термины действительно не используются. Иногда счетчик count не обновлен — выполните wp cache flush и пересчитайте счетчики.
  • Скрипт слишком долго выполняется: разбейте обработку на части и запускайте через Cron с частотой раз в день.

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

  • Всегда делайте резервную копию базы данных перед массовым удалением данных.
  • Используйте транзакции, если работаете с базой напрямую через $wpdb, чтобы избежать частичного удаления.
  • Для больших магазинов запускайте очистку в off-peak часы, чтобы не нагружать сервер.
  • Проверяйте, что функции удаления вызываются только с правами администратора, чтобы избежать несанкционированного удаления.

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

МетодПлюсыМинусы
Удаление вручную через админкуПростой, не требует кодаМного времени при большом количестве товаров
Использование плагинов (например, WP Reset, Clearfy Pro)Автоматизация, удобный интерфейсДополнительная нагрузка, возможные конфликты
Код в functions.php (как в статье)Полный контроль, без сторонних плагиновТребует навыков PHP, риски при ошибках
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше