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

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

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

Чтобы проверить, есть ли в базе атрибуты без продуктов, можно выполнить SQL-запрос в phpMyAdmin или через WP-CLI:

SELECT wp_woocommerce_attribute_taxonomies.attribute_name, COUNT(p.ID) AS product_count 
FROM wp_woocommerce_attribute_taxonomies 
LEFT JOIN wp_term_taxonomy tt ON tt.taxonomy = CONCAT('pa_', wp_woocommerce_attribute_taxonomies.attribute_name) 
LEFT JOIN wp_term_relationships tr ON tr.term_taxonomy_id = tt.term_taxonomy_id 
LEFT JOIN wp_posts p ON p.ID = tr.object_id AND p.post_type = 'product' AND p.post_status = 'publish' 
GROUP BY wp_woocommerce_attribute_taxonomies.attribute_name 
HAVING product_count = 0;

Если запрос вернет строки, это значит, что эти атрибуты есть в базе, но не связаны ни с одним продуктом.

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

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

function get_unused_woocommerce_attributes() {
    global $wpdb;
    $query = "
        SELECT attribute_name 
        FROM {$wpdb->prefix}woocommerce_attribute_taxonomies AS attr 
        LEFT JOIN {$wpdb->prefix}term_taxonomy AS tt ON tt.taxonomy = CONCAT('pa_', attr.attribute_name) 
        LEFT JOIN {$wpdb->prefix}term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id 
        LEFT JOIN {$wpdb->prefix}posts AS p ON p.ID = tr.object_id AND p.post_type = 'product' AND p.post_status = 'publish' 
        GROUP BY attribute_name 
        HAVING COUNT(p.ID) = 0
    ";
    return $wpdb->get_col($query);
}

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

Удаление атрибута требует удаления записи из таблицы woocommerce_attribute_taxonomies и удаления таксономии (префикс pa_ + имя атрибута) из WordPress.

function delete_woocommerce_attribute($attribute_name) {
    global $wpdb;
    // Удаляем запись из таблицы атрибутов
    $deleted = $wpdb->delete(
        "{$wpdb->prefix}woocommerce_attribute_taxonomies",
        [ 'attribute_name' => $attribute_name ],
        [ '%s' ]
    );

    // Регистрируем таксономию атрибута для удаления терминов и таксономии
    $taxonomy = 'pa_' . $attribute_name;

    if (taxonomy_exists($taxonomy)) {
        // Удаляем все термины таксономии
        $terms = get_terms([ 'taxonomy' => $taxonomy, 'hide_empty' => false ]);
        if (!is_wp_error($terms)) {
            foreach ($terms as $term) {
                wp_delete_term($term->term_id, $taxonomy);
            }
        }

        // Удаляем саму таксономию из кеша
        unregister_taxonomy($taxonomy);
    }

    // Очищаем кеш таксономий
    delete_option("woocommerce_attribute_taxonomies");

    return $deleted !== false;
}

3. Запуск удаления для всех найденных неиспользуемых атрибутов

$unused_attributes = get_unused_woocommerce_attributes();

foreach ($unused_attributes as $attribute) {
    $result = delete_woocommerce_attribute($attribute);
    if ($result) {
        echo "Атрибут {$attribute} успешно удален.<br>";
    } else {
        echo "Ошибка при удалении атрибута {$attribute}.<br>";
    }
}

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

  • Повторно выполните SQL-запрос из блока диагностики — он не должен возвращать удалённые атрибуты.
  • Проверьте раздел Товары > Атрибуты в админке — удалённые атрибуты отсутствуют.
  • Убедитесь, что товары корректно отображаются и фильтры работают без ошибок.
  • Проверьте логи ошибок сервера на предмет неожиданных ошибок после удаления.

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

  • Ошибка SQL или права доступа: убедитесь, что пользователь базы данных WordPress имеет права DELETE для таблицы woocommerce_attribute_taxonomies.
  • Атрибут не удаляется из админки: возможно, атрибут используется в скрытых или черновых товарах — проверьте все статусы публикации.
  • Проблемы с кэшированием: очистите кэш сайта и браузера, а также кэш плагинов (например, WP Rocket, W3 Total Cache).
  • Удаление терминов не происходит: проверьте, что функция wp_delete_term вызывается корректно и нет конфликтов с плагинами.

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

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

Сравнение вариантов удаления неиспользуемых атрибутов

МетодПлюсыМинусы
Удаление через код (как в статье)Полный контроль, автоматизация, можно запускать по расписаниюТребует навыков, может вызвать ошибки при неправильном коде
Удаление вручную через админкуПросто, не требует кодаТрудоемко при большом количестве, не удаляет атрибуты без терминов
Плагины для оптимизации WooCommerce (например, Clearfy Pro)Интегрированные инструменты очистки, удобно для непрофессионаловМожет быть платным, не всегда гибко
Как изменить динамический заголовок страницы в WordPress
17.01.2026
Как использовать хук WooCommerce before_add_to_cart для дополнительной логики в корзине
14.05.2026
Решение проблемы неработающей отправки формы оформления заказа в WooCommerce
06.06.2026
Как использовать функции WooCommerce в WordPress для разработки
04.12.2025
Как создать динамический файл robots.txt в WordPress для улучшения SEO
01.02.2026