Проблема: устаревшие атрибуты в фильтрах после удаления товаров
При использовании WooCommerce в связке с темой GeneratePress, после удаления товаров с определёнными атрибутами фильтры по этим атрибутам могут продолжать отображаться в сайдбаре или в виджетах фильтрации. Это приводит к появлению пустых фильтров, ухудшает UX и вводит пользователей в заблуждение.
Такой эффект обычно возникает из-за того, что WooCommerce кэширует атрибуты или их термины, а также из-за некорректной работы виджетов фильтрации, которые не обновляются автоматически после удаления товаров.
Диагностика проблемы
- Проверьте, отображаются ли в фильтрах атрибуты, не связанные с существующими товарами.
- Используйте инструмент «Товары → Атрибуты» в админке: проверьте, остались ли термины атрибутов, которые не применяются ни к одному товару.
- Очистите кэш сайта и кэш плагинов (если используется кеширование).
- Проверьте, обновляется ли база данных терминов после удаления товаров — для этого можно использовать SQL-запросы или плагины для управления таксономиями.
Пошаговое решение
1. Очистка неиспользуемых терминов атрибутов
WooCommerce не удаляет термины атрибутов при удалении товаров автоматически. Чтобы удалить неиспользуемые термины, можно использовать следующий PHP-код. Добавьте его в файл functions.php дочерней темы или в плагин для пользовательских функций:
add_action('woocommerce_delete_product', 'remove_unused_attribute_terms', 10, 1);
function remove_unused_attribute_terms($product_id) {
$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,
));
foreach ($terms as $term) {
$term_count = $term->count;
if ($term_count === 0) {
wp_delete_term($term->term_id, $taxonomy);
}
}
}
}Этот код запускается при удалении товара и удаляет все термины в атрибутах, у которых нет связанных товаров.
2. Принудительная очистка кэша WooCommerce и транзиентов
После удаления терминов рекомендуется очистить транзиенты WooCommerce, чтобы обновить фильтры. Для этого можно добавить такой код:
add_action('woocommerce_delete_product', function() {
wc_delete_product_transients();
});Или выполнить очистку вручную через админку, если установлен плагин для очистки кэша.
3. Проверка виджетов фильтрации
Убедитесь, что используемые виджеты фильтрации (например, "Фильтр по атрибутам WooCommerce") корректно работают. Если это не так, рассмотрите альтернативные плагины с поддержкой AJAX-фильтрации, например, Clearfy Pro — он помогает оптимизировать работу фильтров и удалять лишние атрибуты.
Проверка результата после внедрения
- Удалите товар с уникальным атрибутом.
- Очистите кэш сайта и браузера.
- Проверьте фильтр на сайте: атрибут, связанный с удалённым товаром, должен исчезнуть.
- В админке WooCommerce убедитесь, что соответствующий термин в атрибутах удалён.
Частые ошибки и как их исправить
- Код не срабатывает при удалении товара через пакетное удаление: хук
woocommerce_delete_productвызывается только при удалении одного товара, для массового удаления используйтеbefore_delete_postс проверкой типа поста'product'. - Ошибки прав доступа при удалении терминов: убедитесь, что код запускается с правами администратора или в контексте, где разрешено удаление терминов.
- Фильтры не обновляются сразу: возможно, нужно дополнительно сбросить кэш плагинов или CDN.
- Удаляются нужные термины: проверьте логику подсчёта товаров у термина — иногда товары в черновиках или с другим статусом считаются.
Практические советы по производительности и безопасности
- Для больших магазинов не запускайте очистку терминов на каждый вызов удаления товара — лучше использовать WP Cron для периодической очистки.
- Всегда делайте бэкап базы данных перед массовыми изменениями терминов.
- Избегайте прямого удаления терминов без проверки — можно случайно удалить нужные атрибуты.
- При использовании пользовательских плагинов фильтрации тестируйте совместимость с GeneratePress и WooCommerce на тестовом сайте.
Сравнение подходов удаления неиспользуемых атрибутов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код на хук удаления товара | Удаление терминов сразу при удалении товара | Автоматично, не требует ручных действий | Может замедлить удаление, не работает при массовом удалении |
| WP Cron с периодической очисткой | Очистка терминов по расписанию | Не влияет на скорость удаления товара, контролируемая нагрузка | Задержка между удалением товара и очисткой терминов |
| Плагины типа Clearfy Pro | Оптимизация и очистка фильтров с UI | Удобство, дополнительные функции безопасности и оптимизации | Платное решение, зависит от стороннего плагина |