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

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

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

Чтобы выявить такие товары, необходимо проверить:

  • Тип товара — вариативный или простой
  • Наличие записей атрибутов pa_* в метаданных товара
  • Наличие вариаций в дочерних товарах (для вариативных товаров)

С помощью SQL-запроса можно быстро получить список товаров без атрибутов и вариаций:

SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key LIKE 'attribute_%'
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
GROUP BY p.ID
HAVING COUNT(pm.meta_key) = 0;

Этот запрос показывает товары, у которых нет метаданных с атрибутами. Для вариативных товаров дополнительно нужно проверить дочерние вариации.

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

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

1. Функция для проверки товара

function has_attributes_or_variations( $product_id ) {
    $product = wc_get_product( $product_id );
    if ( ! $product ) {
        return false;
    }

    // Проверка вариаций
    if ( $product->is_type( 'variable' ) ) {
        $variations = $product->get_children();
        if ( ! empty( $variations ) ) {
            return true;
        }
    }

    // Проверка атрибутов
    $attributes = $product->get_attributes();
    foreach ( $attributes as $attribute ) {
        if ( $attribute->is_taxonomy() ) {
            $terms = wp_get_post_terms( $product_id, $attribute->get_name() );
            if ( ! empty( $terms ) ) {
                return true;
            }
        } elseif ( $attribute->get_options() ) {
            return true;
        }
    }

    return false;
}

2. Функция удаления товаров без вариаций и атрибутов

function delete_products_without_variations_and_attributes() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'fields'         => 'ids',
    );

    $products = get_posts( $args );
    $deleted_count = 0;

    foreach ( $products as $product_id ) {
        if ( ! has_attributes_or_variations( $product_id ) ) {
            wp_delete_post( $product_id, true );
            $deleted_count++;
        }
    }

    return $deleted_count;
}

3. Запуск функции вручную

Для теста можно добавить временный вызов в functions.php или использовать WP-CLI:

add_action( 'admin_init', function() {
    if ( current_user_can( 'administrator' ) && isset( $_GET['delete_empty_products'] ) ) {
        $deleted = delete_products_without_variations_and_attributes();
        echo 'Удалено товаров без вариаций и атрибутов: ' . $deleted;
        exit;
    }
});

Далее в браузере достаточно перейти по адресу https://example.com/wp-admin/?delete_empty_products=1 под администратором.

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

  • Запустите SQL-запрос из раздела диагностики до и после удаления — количество товаров без атрибутов должно стать нулём.
  • Проверьте в админке WooCommerce — товары без вариаций и атрибутов должны исчезнуть.
  • Проверьте логи ошибок и отчёты на предмет случайных удалений.

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

  • Удаляются нужные товары: проверьте, что функция has_attributes_or_variations корректно определяет наличие вариаций и атрибутов. Часто атрибуты могут быть в собственных метах, не в taxonomy.
  • Ошибка памяти при большом количестве товаров: используйте постраничный запрос с 'posts_per_page' => 100 и обработку по частям.
  • Неправильный статус товаров: убедитесь, что проверяются только опубликованные товары (post_status = 'publish'), чтобы не удалять черновики или архивные товары.

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

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

Сравнение способов удаления товаров без вариаций и атрибутов

МетодПлюсыМинусы
SQL-запрос + ручное удалениеБыстрое выявление товаровРучная работа, риск ошибок
PHP-скрипт с циклом (как в статье)Автоматизация, точный контрольПотенциальные проблемы с производительностью
Плагины очистки каталогаУдобство, готовые решенияМогут быть избыточными и нагружать сайт

В большинстве случаев рекомендуем использовать PHP-скрипт с разбивкой по партиям и предварительным тестированием.

Как удалить пользовательский аккаунт со всеми данными в WordPress
19.02.2026
Как создать и использовать хлебные крошки в WordPress
11.02.2026
Как запретить регистрацию в WordPress и удалить форму регистрации
13.03.2026
Как удалить неиспользуемые метаданные в WordPress для оптимизации сайта
10.12.2025
WooCommerce: автоматическое удаление товаров с нулевым остатком без плагинов
12.06.2026