Диагностика проблемы: пустые варианты атрибутов в WooCommerce
В интернет-магазинах на WooCommerce часто сталкиваются с тем, что в списках атрибутов продуктов появляются пустые варианты. Это происходит, когда атрибуты создавались или импортировались, но к ним не привязаны товары. Пустые варианты создают неудобство для покупателей и могут негативно сказаться на SEO, поскольку генерируют лишние страницы с пустым контентом.
Чтобы проверить наличие пустых вариантов, перейдите в Товары > Атрибуты, выберите нужный атрибут и нажмите «Настроить термины». Там отобразятся все варианты, включая те, которые не используются ни в одном товаре.
Пошаговое решение: удаление пустых вариантов атрибутов через PHP
1. Использование WP-CLI для быстрой проверки (опционально)
Если у вас есть доступ к WP-CLI, можно быстро проверить количество товаров на каждый термин атрибута:
wp term list pa_color --format=json --fields=term_id,name,countЗначение поля count показывает, сколько товаров привязано к термину. Нулевые — кандидаты на удаление.
2. PHP-скрипт для автоматического удаления пустых вариантов
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин. Код обходит все термины атрибутов, проверяет связь с продуктами и удаляет пустые варианты.
function wp24_delete_empty_product_attribute_terms() {
$attribute_taxonomies = wc_get_attribute_taxonomies();
foreach ( $attribute_taxonomies as $attribute ) {
$taxonomy = wc_attribute_taxonomy_name( $attribute->attribute_name );
$terms = get_terms( array(
'taxonomy' => $taxonomy,
'hide_empty' => false,
) );
if ( is_wp_error( $terms ) ) {
continue;
}
foreach ( $terms as $term ) {
if ( $term->count === 0 ) {
wp_delete_term( $term->term_id, $taxonomy );
error_log( "Deleted empty term '{$term->name}' from taxonomy '{$taxonomy}'" );
}
}
}
}
add_action( 'init', 'wp24_delete_empty_product_attribute_terms' );Важно: после первого запуска функцию рекомендуется удалить или закомментировать, чтобы избежать повторных удалений и нагрузки на сайт.
Проверка результата после внедрения
Чтобы убедиться, что пустые варианты удалены:
- Перейдите в Товары > Атрибуты и откройте список терминов каждого атрибута — пустых там больше не должно быть.
- Проверьте наличие ошибок в
error_logили системном логе сервера — там появятся записи об удалённых терминах. - На фронтенде сайта проверьте страницы фильтрации по атрибутам — пустых вариантов и ссылок на них не должно быть.
Частые ошибки и как их исправить
Удаление не тех терминов
Иногда атрибуты выглядят пустыми, но связаны с черновиками или скрытыми товарами. Чтобы не удалить нужные варианты, убедитесь, что учитываете только активные продукты:
get_terms( array(
'taxonomy' => $taxonomy,
'hide_empty' => true,
) );Но этот метод исключит именно пустые. Если надо учитывать только опубликованные товары, придётся написать кастомный запрос для подсчёта.
Нагрузка на сайт при большом количестве терминов
Выполнение удаления на хук init каждый раз увеличит время загрузки страницы. Запускайте скрипт вручную или через WP-CLI, либо снимайте хук после первого выполнения.
Практические советы по безопасности и производительности
- Перед запуском скрипта сделайте полную резервную копию базы данных.
- Запускайте код на staging-сервере или в безопасное время с низкой нагрузкой.
- Для регулярной очистки используйте WP-CLI с командой, которая запускает функцию, или создайте кастомную WP-CLI команду.
- Для больших магазинов с тысячами терминов оптимизируйте код, проверяя удаление пакетами, чтобы избежать превышения лимитов памяти.
Сравнение вариантов очистки пустых терминов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление вручную через админку | Простой, не требует кода | Трудоёмко при большом количестве, риск пропустить |
| Автоматический PHP-скрипт | Быстрое массовое удаление, можно автоматизировать | Риск удаления нужных терминов, нагрузка при неправильном запуске |
| WP-CLI команда | Эффективно для больших сайтов, без нагрузки на фронтенд | Требует доступа к командной строке |