Проблема: необходимость автоматической установки родительской категории товара
В стандартном WooCommerce при создании товара категории нужно назначать вручную. Часто у магазинов сложная иерархия категорий, и нужно, чтобы при выборе дочерней категории автоматически добавлялась и соответствующая родительская, чтобы не потерять важные связи для фильтров и навигации.
Диагностика проблемы
Проверьте, что при добавлении товара в дочернюю категорию родительская не выбирается автоматически:
- Откройте страницу редактирования товара в админке.
- В блоке категорий отметьте дочернюю категорию.
- Сохраните товар и проверьте в базе или в фронтенде, что родительская категория не прикреплена.
Если родительские категории не добавляются автоматически — это стандартное поведение WooCommerce.
Пошаговое решение: добавляем код для автоподстановки родительской категории
Реализуем PHP-функцию, которая при сохранении товара будет проверять выбранные категории, находить их родительские категории и добавлять их к товару.
add_action('save_post_product', 'wc_auto_add_parent_categories', 20, 3);function wc_auto_add_parent_categories($post_id, $post, $update) { if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if ($post->post_type !== 'product') return; // Получаем все категории товара $terms = wp_get_post_terms($post_id, 'product_cat', array('fields' => 'ids')); if (empty($terms)) return; $all_terms = $terms; foreach ($terms as $term_id) { $parent_id = wp_get_term_taxonomy_parent_id($term_id, 'product_cat'); while ($parent_id) { if (!in_array($parent_id, $all_terms)) { $all_terms[] = $parent_id; } $parent_id = wp_get_term_taxonomy_parent_id($parent_id, 'product_cat'); } } // Обновляем категории товара, включая родительские wp_set_post_terms($post_id, $all_terms, 'product_cat');}Объяснение:
- Хук
save_post_productсрабатывает при сохранении товара. - Получаем все текущие категории товара, включая дочерние.
- Для каждой категории поднимаемся по иерархии, добавляя родительские категории в массив.
- Обновляем категории товара, передавая полный список.
Как проверить, что решение работает
- Создайте или отредактируйте товар в админке.
- Выберите только дочернюю категорию.
- Сохраните товар.
- Проверьте, что в метабоксе категорий теперь отмечены и родительские категории.
- Также можно проверить через WP CLI:
wp term list product_cat --post_id=ID_товараили запросом к базе.
Частые ошибки и их причины
- Код не срабатывает при массовом импорте товаров. При импорте хуки сохранения могут не вызываться, решается дополнительной обработкой после импорта.
- Бесконечный цикл при обходе родителей. Если в таксономии есть циклы (ошибка в базе), функция
wp_get_term_taxonomy_parent_idможет зациклиться. Проверьте целостность таксономии. - Конфликт с другими плагинами, которые изменяют категории товара. В таких случаях нужно подстроить приоритет хука или использовать фильтры WooCommerce.
Практические советы по производительности и безопасности
- Обрабатывайте только нужный тип постов —
product, чтобы избежать лишних вызовов. - Добавьте проверку
DOING_AUTOSAVE, чтобы не запускать при автосохранении. - Для больших магазинов с тысячами категорий используйте кеширование результатов функции
wp_get_term_taxonomy_parent_idвнутри цикла. - Если используете сторонние плагины импорта, убедитесь, что они поддерживают выполнение хука
save_post_product.
Таблица сравнения вариантов реализации
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код на хуке save_post_product (как в статье) | Автоматическая подстановка при сохранении товара | Простой, не требует плагинов, работает для всех товаров | Не срабатывает при массовом импорте без вызова хуков |
| Использование плагинов автозаполнения категорий | Готовые решения с настройками | Удобный интерфейс, поддержка | Нагрузка, возможны конфликты, часто платные |
| Реализация через JavaScript на странице редактирования | Автоматическая галочка родительской категории в админке | Мгновенная реакция пользователя | Не гарантирует корректность в базе при импорте или API |