В чем заключается проблема с массовым изменением категорий товаров в WooCommerce?
При массовом изменении категорий товаров через админку WooCommerce или импорт CSV часто возникает ситуация, когда дочерние категории присваиваются товарам без автоматического добавления их родительских категорий. Это приводит к некорректному отображению товаров в фильтрах и навигации, а также ухудшает SEO.
Диагностика проблемы
Чтобы проверить, возникает ли проблема с присвоением родительских категорий, сделайте следующее:
- Перейдите в «Товары» > «Категории» и проверьте иерархию категорий.
- Выберите несколько товаров и массово присвойте им дочерние категории через «Массовые действия» > «Изменить».
- Откройте карточки товаров и убедитесь, что родительские категории не добавились автоматически.
- Проверьте работу виджетов фильтрации по категориям — товары с дочерними категориями могут не отображаться при фильтрации по родительским.
Пошаговое решение: автоматическое добавление родительских категорий
Решение — программно добавлять родительские категории при сохранении или массовом обновлении товара. Для этого используем хук save_post_product, который срабатывает при сохранении товара, и дополняем категории.
Пример кода, который добавляет родительские категории к товару при сохранении:
add_action('save_post_product', 'add_parent_categories_to_product', 20, 3);
function add_parent_categories_to_product($post_id, $post, $update) {
// Проверяем тип поста
if ($post->post_type !== 'product') {
return;
}
// Получаем все категории товара
$terms = wp_get_post_terms($post_id, 'product_cat');
if (is_wp_error($terms) || empty($terms)) {
return;
}
$all_cats = [];
foreach ($terms as $term) {
$all_cats[] = $term->term_id;
// Получаем всех родителей категории
$parent_id = $term->parent;
while ($parent_id) {
$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');
}Этот код гарантирует, что при сохранении товара будут автоматически добавлены все родительские категории выбранных дочерних.
Автоматизация для массового редактирования
При массовом редактировании через админку WooCommerce хук save_post_product также срабатывает, поэтому данный код применится и к массовым изменениям.
Если вы импортируете товары из CSV, рекомендуется запускать аналогичный скрипт после импорта, чтобы дополнить категории родительскими.
Как проверить, что решение работает
- После массового изменения категорий или импорта откройте карточку любого товара с дочерней категорией — в списке категорий должны отображаться родительские.
- Проверьте, что фильтры по родительским категориям показывают товары с дочерними категориями.
- Используйте WP CLI для выборочного просмотра категорий товара:
wp post term list [ID_товара] product_cat.
Частые ошибки и причины
- Код не срабатывает при импорте CSV — потому что импорт может напрямую писать в базу или использовать свои хуки. Нужно запускать функцию вручную после импорта.
- Циклическая иерархия категорий — если родитель и ребенок ссылаются друг на друга, код может вызвать бесконечный цикл. Проверяйте структуру категорий.
- Проблемы с правами — код должен запускаться с достаточными правами, чтобы изменять посты и таксономии.
- Неправильный хук — использование
save_postбез проверки типа поста может привести к ошибкам.
Практические советы для производительности и безопасности
- Добавляйте проверку
wp_is_post_autosave()иwp_is_post_revision()в функцию, чтобы избежать лишних срабатываний. - Кэшируйте результаты
get_term()при обходе родителей, если обрабатываете много товаров. - Для больших сайтов с сотнями тысяч товаров лучше запускать скрипт пакетами через WP CLI или wp-cron, чтобы не перегружать сервер.
- Всегда делайте бэкап перед массовыми изменениями категорий.
Сравнение вариантов решения
| Метод | Преимущества | Недостатки |
|---|---|---|
Код на хуке save_post_product | Автоматически работает при сохранении и массовом редактировании, не требует плагинов. | Не срабатывает при прямом импорте, возможны проблемы с производительностью на больших сайтах. |
| Плагин для массового обновления категорий | Готовое решение, может иметь дополнительные функции (логирование, отчёты). | Зависимость от стороннего кода, возможно платное, может замедлять сайт. |
| Ручной запуск WP CLI скрипта после импорта | Высокая производительность, полный контроль над процессом. | Требует навыков работы с командной строкой, не автоматизировано. |