Диагностика проблемы с пустой родительской категорией
После массового импорта товаров в WooCommerce часто возникает ситуация, когда у товаров не отображается родительская категория, хотя дочерние категории присвоены правильно. Это приводит к некорректной иерархии категорий на витрине и проблемам с фильтрацией.
Основные признаки проблемы:
- В админке в карточке товара указана только дочерняя категория, но не родительская.
- На странице каталога не отображаются товары по родительским категориям.
- Фильтры категорий WooCommerce работают некорректно, игнорируя родительские категории.
Как проверить проблему
Откройте импортированный товар в админке WordPress и проверьте, что в блоке категорий выбран только дочерний термин. Затем проверьте структуру категорий в разделе Товары → Категории. Если родительская категория есть, но не присвоена товару, значит импортировались только дочерние категории.
Пошаговое решение: автоматическое добавление родительской категории после импорта
WooCommerce по умолчанию не добавляет родительские категории автоматически при импорте. Для исправления нужно добавить код, который при сохранении товара будет дописывать родительские категории автоматически.
1. Добавление PHP-кода в functions.php или отдельный плагин
add_action('save_post_product', 'add_parent_categories_automatically', 20, 1);function add_parent_categories_automatically($post_id) { if (wp_is_post_revision($post_id) || wp_is_post_autosave($post_id)) { return; } $terms = wp_get_post_terms($post_id, 'product_cat'); if (empty($terms) || is_wp_error($terms)) { return; } $all_cats = array(); foreach ($terms as $term) { $all_cats[] = $term->term_id; $parent_id = $term->parent; while ($parent_id != 0) { $all_cats[] = $parent_id; $parent_term = get_term($parent_id, 'product_cat'); if (is_wp_error($parent_term) || !$parent_term) { break; } $parent_id = $parent_term->parent; } } $all_cats = array_unique($all_cats); wp_set_post_terms($post_id, $all_cats, 'product_cat');}Этот код при сохранении товара получает все назначенные категории, находит их родителей и рекурсивно добавляет их к товару.
2. Применение к уже импортированным товарам
Чтобы применить исправление к товарам, которые уже импортированы, используйте следующий скрипт один раз:
$args = [ 'post_type' => 'product', 'posts_per_page' => -1, 'post_status' => 'publish',];$products = get_posts($args);foreach ($products as $product) { add_parent_categories_automatically($product->ID);}Запустите этот код через админский PHP-редактор или временно в functions.php, затем удалите.
Проверка результата после внедрения
После реализации решения:
- Откройте товар в админке, убедитесь, что в блоке категорий теперь есть как дочерние, так и родительские категории.
- Проверьте на витрине, что товары отображаются в родительских категориях.
- Проверьте работу фильтров WooCommerce — они должны корректно фильтровать по всем уровням категорий.
Частые ошибки и их исправление
- Код не работает после импорта — убедитесь, что импорт товаров завершён и товары имеют дочерние категории. Код не добавит родителей, если нет дочерних.
- Функция запускается в бесконечном цикле — используйте приоритет 20 и проверяйте, что не обрабатываете ревизии и автосохранения.
- Неправильные ID категорий — проверьте таксономию
product_catи что все категории существуют иерархично. - Кэширование мешает видеть изменения — очистите кеш сайта и браузера.
Практические советы по производительности и безопасности
- Для больших сайтов с тысячами товаров разбивайте обработку на пачки, чтобы избежать тайм-аутов.
- Перед массовым запуском кода сделайте бэкап базы.
- Не оставляйте код для добавления категорий постоянно в functions.php, используйте временно или отдельный плагин с возможностью отключения.
- Проверьте права пользователя, запускающего код, чтобы избежать случайного изменения товаров.
Сравнение методов решения проблемы
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное добавление категорий в админке | Просто, не требует кода | Невозможно для большого количества товаров | Малые сайты |
| Автоматическое добавление через хук save_post | Автоматизация, работает при сохранении | Требуется запуск для уже импортированных товаров | Средние и большие сайты |
| Модификация процесса импорта (плагины) | Полный контроль при импорте | Зависимость от плагина, сложность настройки | Для новых импортов |