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

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

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

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

Проверить наличие пустых вариантов можно через админку WooCommerce: Товары > Атрибуты, выбрать атрибут и нажать «Настроить термины». Если в списке есть варианты без товаров — они пусты.

Для быстрой диагностики программно можно получить список таких вариантов с помощью WP-CLI или кода:

global $wpdb;
$terms = $wpdb->get_results(
    "SELECT t.term_id, t.name, tt.count FROM {$wpdb->terms} t
    INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
    WHERE tt.taxonomy LIKE 'pa_%' AND tt.count = 0"
);
foreach ($terms as $term) {
    echo "Пустой вариант: {$term->name} (ID: {$term->term_id})\n";
}

Здесь tt.count показывает количество товаров, связанных с вариантом. Значение 0 означает, что вариант не используется.

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

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

function wp24_remove_empty_product_attribute_terms() {
    global $wpdb;
    $empty_terms = $wpdb->get_col(
        "SELECT t.term_id FROM {$wpdb->terms} t
         INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
         WHERE tt.taxonomy LIKE 'pa_%' AND tt.count = 0"
    );

    if (!empty($empty_terms)) {
        foreach ($empty_terms as $term_id) {
            wp_delete_term($term_id, get_taxonomies(['name__like' => 'pa_'])[0]);
        }
    }
}

// Запуск при активации темы или вручную
add_action('after_setup_theme', 'wp24_remove_empty_product_attribute_terms');

Обратите внимание, что get_taxonomies(['name__like' => 'pa_'])[0] возвращает первый атрибут, это подходит если у вас один атрибут. Для нескольких атрибутов логика удаления должна быть с учётом конкретной таксономии.

Расширенный вариант для всех атрибутов

function wp24_remove_empty_terms_all_attributes() {
    global $wpdb;
    $attribute_taxonomies = wc_get_attribute_taxonomies();

    foreach ($attribute_taxonomies as $attribute) {
        $taxonomy = wc_attribute_taxonomy_name($attribute->attribute_name);
        $empty_terms = $wpdb->get_col($wpdb->prepare(
            "SELECT t.term_id FROM {$wpdb->terms} t
             INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
             WHERE tt.taxonomy = %s AND tt.count = 0",
            $taxonomy
        ));

        foreach ($empty_terms as $term_id) {
            wp_delete_term($term_id, $taxonomy);
        }
    }
}
add_action('after_setup_theme', 'wp24_remove_empty_terms_all_attributes');

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

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

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

Частые ошибки и способы их исправления

  • Неправильный таксономический идентификатор: В функциях удаления важно правильно определить таксономию атрибута. Используйте wc_attribute_taxonomy_name() для формата pa_{slug}.
  • Удаление терминов, связанных с продуктами: Не удаляйте варианты с count > 0, иначе товары потеряют связь с атрибутами.
  • Не вызывается функция: Проверьте, что хук after_setup_theme срабатывает, или вызовите функцию вручную через WP-CLI или временный админский скрипт.
  • Проблемы с правами: Убедитесь, что пользователь, под которым запускается код, имеет права на удаление терминов.

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

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

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

МетодПлюсыМинусыРекомендуется для
Удаление вручную через админкуПросто, не требует кодаДолго при большом количествеМаленькие магазины
WP-CLI скриптБыстро, можно автоматизироватьТребует доступа к серверуСредние и крупные проекты
PHP-функция в теме или плагинеАвтоматизация, гибкостьРиск ошибочного удаленияРазработчики и опытные администраторы
Как добавить уникальные поля в форму регистрации WordPress с проверкой уникальности
24.02.2026
Как удалить загрузку шаблонов Gutenberg в WordPress для оптимизации сайта
25.03.2026
Как отключить Gutenberg и вернуть классический редактор в WordPress
06.01.2026
Удаление неиспользуемых таблиц в базе данных WordPress: практическое руководство
28.11.2025
Как кастомизировать пункты меню в админке WordPress: удаление, переименование и добавление
15.03.2026