Проблема с отсутствием или некорректным присвоением родительских категорий при импорте товаров в WooCommerce
При массовом импорте товаров в WooCommerce часто встречается ситуация, когда товары получают дочерние категории, но родительские категории не устанавливаются автоматически. Это приводит к проблемам в навигации, фильтрации и отображении иерархии категорий в магазине.
Диагностика проблемы
Чтобы выявить проблему, необходимо:
- Проверить CSV или XML файл импорта на наличие полей с родительскими категориями.
- Посмотреть, как импортирует товары ваш плагин (стандартный WooCommerce, WP All Import или др.).
- Убедиться, что в базе данных в таблице
wp_term_relationshipsу товара прописаны связи с родительскими категориями. - Посмотреть, как ведёт себя фронтенд: отображается ли родительская категория в хлебных крошках и фильтрах.
В большинстве случаев плагин импорта не умеет автоматически добавлять родительские категории, если в файле указаны только дочерние категории.
Пошаговое решение: автоматическое добавление родительских категорий при импорте
1. Добавление пользовательского кода для установки родительских категорий
После импорта товара через стандартный WordPress- или WooCommerce-процесс, срабатывает хук save_post. Можно использовать этот хук, чтобы автоматически добавлять родительские категории, если они не установлены.
add_action('save_post_product', 'set_parent_categories_after_import', 20, 3);
function set_parent_categories_after_import($post_ID, $post, $update) {
if ($update) { // Только обновления, чтобы не влиять при создании вручную
$terms = wp_get_post_terms($post_ID, 'product_cat');
$parent_ids = [];
foreach ($terms as $term) {
$parent_id = $term->parent;
while ($parent_id != 0) {
if (!in_array($parent_id, $parent_ids)) {
$parent_ids[] = $parent_id;
}
$parent_term = get_term($parent_id, 'product_cat');
$parent_id = $parent_term->parent;
}
}
if ($parent_ids) {
$existing_terms = wp_get_post_terms($post_ID, 'product_cat', ['fields' => 'ids']);
$all_terms = array_unique(array_merge($existing_terms, $parent_ids));
wp_set_post_terms($post_ID, $all_terms, 'product_cat');
}
}
}Данный код гарантирует, что при сохранении товара все родительские категории дочерних категорий будут добавлены.
2. Интеграция с плагинами импорта
Если вы используете WP All Import, рекомендую добавить этот код как дополнительное действие после импорта или использовать встроенную функцию "PHP функции" для обработки категорий. Например:
function add_parent_cats($product_id) {
$terms = wp_get_post_terms($product_id, 'product_cat');
$parent_ids = [];
foreach ($terms as $term) {
$parent_id = $term->parent;
while ($parent_id != 0) {
if (!in_array($parent_id, $parent_ids)) {
$parent_ids[] = $parent_id;
}
$parent_term = get_term($parent_id, 'product_cat');
$parent_id = $parent_term->parent;
}
}
if ($parent_ids) {
$existing_terms = wp_get_post_terms($product_id, 'product_cat', ['fields' => 'ids']);
$all_terms = array_unique(array_merge($existing_terms, $parent_ids));
wp_set_post_terms($product_id, $all_terms, 'product_cat');
}
}
add_action('pmxi_after_post_import', function($post_id) {
add_parent_cats($post_id);
});Проверка результата после внедрения
- После импорта товаров откройте карточку товара в админке и убедитесь, что в метабоксе категорий отображаются и родительские категории.
- Проверьте на фронтенде — хлебные крошки или фильтры должны показывать полную иерархию.
- Выполните запрос к базе
SELECT term_taxonomy_id FROM wp_term_relationships WHERE object_id = ID_товара;— должен вернуть и дочерние, и родительские категории.
Частые ошибки и как их исправить
- Привязка только дочерних категорий, родительские не добавляются: плагин импорта не умеет работать с иерархией, нужно добавить пользовательский код (как показано выше).
- Хук срабатывает слишком часто, замедляя импорт: добавьте проверку
$updateи минимизируйте запросы к базе. - Конфликты с другими плагинами кэширования или оптимизации: очистите кэш после импорта.
- Некорректное отображение хлебных крошек: проверьте настройки темы или плагина хлебных крошек, возможно, нужно обновить их после правок категорий.
Практические советы по производительности и безопасности
- Вместо массового вызова
wp_set_post_termsдля каждого товара, если импортируете тысячи товаров, используйте пакетную обработку через WP CLI или оптимизированные запросы к базе. - Всегда делайте резервную копию базы перед массовым импортом и изменениями категорий.
- Используйте транзакции базы данных в кастомных скриптах для отката при ошибках.
- Проверяйте права пользователя перед изменением категорий в коде, чтобы избежать уязвимостей.
Сравнение вариантов решения задачи
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Пользовательский код на save_post | Добавляет родительские категории после сохранения товара | Работает с любым импортом; легко адаптировать | Может замедлить импорт при большом объёме |
Интеграция с WP All Import (pmxi_after_post_import) | Автоматизация непосредственно после импорта | Точная точка срабатывания; меньше нагрузки | Зависит от плагина; требует настройки |
| Ручное исправление после импорта | Через SQL-запросы или админку | Простота для единичных случаев | Не подходит для массового импорта; риск ошибок |