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

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

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

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

Атрибуты в WooCommerce хранятся в wp_woocommerce_attribute_taxonomies, а связь с продуктами устанавливается через терминологии и таксономии, например pa_color, pa_size и т.д.

Для выявления неиспользуемых атрибутов можно выполнить SQL-запрос, который покажет атрибуты без связанных терминов в продуктах:

SELECT attribute_name FROM wp_woocommerce_attribute_taxonomies WHERE attribute_id NOT IN (SELECT DISTINCT SUBSTRING_INDEX(taxonomy, 'pa_', -1) FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%');

Однако проще проверить наличие прикреплённых терминов к атрибуту программно.

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

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

function wplite_remove_unused_woocommerce_attributes() {
    global $wpdb;

    // Получаем все атрибуты
    $attributes = wc_get_attribute_taxonomies();

    foreach ( $attributes as $attribute ) {
        $taxonomy = wc_attribute_taxonomy_name( $attribute->attribute_name );

        // Считаем количество терминов, которые используются в товарах
        $term_count = $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(tr.term_taxonomy_id) FROM {$wpdb->term_taxonomy} AS tr
             INNER JOIN {$wpdb->term_relationships} AS rel ON tr.term_taxonomy_id = rel.term_taxonomy_id
             WHERE tr.taxonomy = %s",
            $taxonomy
        ) );

        if ( !$term_count ) {
            // Удаляем атрибут, если нет терминов у продуктов
            wc_delete_attribute( $attribute->attribute_id );
            error_log( "Удалён неиспользуемый атрибут: {$attribute->attribute_name}" );
        }
    }
}

// Активируйте функцию однократно, например, через admin_init
add_action( 'admin_init', 'wplite_remove_unused_woocommerce_attributes' );

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

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

  • Перейдите в WooCommerce → Атрибуты и убедитесь, что неиспользуемые атрибуты исчезли.
  • Проверьте фронтенд сайта: фильтры по атрибутам не должны показывать пустые варианты.
  • В логах PHP (если активирована error_log) увидите список удалённых атрибутов.

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

  • Неправильное имя таксономии: используйте функцию wc_attribute_taxonomy_name() для получения корректного имени таксономии.
  • Удаление атрибута не приводит к удалению терминов: функция wc_delete_attribute() удаляет атрибут, но термины в базе могут оставаться. Их можно удалить отдельно, если требуется.
  • Функция запускается постоянно и удаляет нужные атрибуты: запускайте код однократно и удаляйте хук, чтобы избежать случайных удалений.
  • Ошибки прав доступа: функция должна запускаться в админке, желательно с проверкой прав пользователя (например, current_user_can('manage_woocommerce')).

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

  • Перед запуском скрипта сделайте резервную копию базы данных.
  • Используйте хук admin_init и проверяйте права пользователя, чтобы никто случайно не запустил удаление.
  • Если атрибутов много, выполняйте удаление партиями и с логированием, чтобы избежать таймаутов.
  • Для автоматизации и удобства используйте WP-CLI: можно создать кастомную команду для очистки неиспользуемых атрибутов.

Альтернативные способы удаления атрибутов: сравнение

МетодПлюсыМинусы
Удаление через админку WooCommerceИнтуитивно, без кодаТрудозатратно при большом количестве, риск пропуска
SQL-запросы напрямую в базеБыстро, массовоРиск повредить данные, требует навыков SQL
PHP-скрипт (как описано выше)Автоматизация, контроль, логированиеНужны базовые навыки PHP, тестирование
Как добавить дополнительные поля в WPML для перевода нестандартного контента
12.04.2026
Как отключить WooCommerce Cart Fragments для ускорения сайта
06.05.2026
Как удалить закрепленные сообщения в WordPress
28.01.2026
Удаление неиспользуемых таксономий в WordPress: практическое руководство
17.12.2025
Как удалить или изменить метаданные пользователя в WordPress
24.01.2026