Диагностика проблемы: зачем удалять неиспользуемые атрибуты в 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) | Интегрированные инструменты очистки, удобно для непрофессионалов | Может быть платным, не всегда гибко |