Диагностика задачи: зачем нужно автоприсвоение категорий
В WooCommerce при массовом импорте товаров или автоматическом создании товаров через API часто требуется присваивать категории не вручную, а автоматически, основываясь на значениях мета-полей или других критериях. Это существенно ускоряет работу и снижает человеческий фактор ошибок.
Чаще всего пользователи сталкиваются с проблемой:
— товары не попадают в нужные категории, потому что категория не назначается автоматически;
— импортированные товары остаются без категории, что плохо сказывается на фильтрации и SEO;
— нет готовых решений без плагинов или чрезмерного кода.
Пошаговое решение: автоприсвоение категорий через хук сохранения товара
1. Определяем критерий для автоприсвоения
Предположим, у товара есть кастомное мета-поле _product_origin, в котором указано значение "imported" или "domestic". В зависимости от значения присвоим категорию "Импорт" или "Внутренний".
2. Добавляем код в functions.php или в кастомный плагин
add_action('save_post_product', 'auto_assign_category_by_meta', 20, 3);
function auto_assign_category_by_meta($post_id, $post, $update) {
// Проверяем, что это не автосохранение
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
// Получаем мета-значение
$origin = get_post_meta($post_id, '_product_origin', true);
// Категории по условию
$categories_map = [
'imported' => 'import',
'domestic' => 'domestic'
];
if (!isset($categories_map[$origin])) return; // ничего не делаем если условие не подходит
// Получаем ID категории
$term = get_term_by('slug', $categories_map[$origin], 'product_cat');
if (!$term) return; // категория не найдена
// Присваиваем категорию
wp_set_post_terms($post_id, [$term->term_id], 'product_cat', false);
}3. Объяснение кода
- Хук
save_post_productсрабатывает при сохранении товара. - Проверяем, что это не автосохранение.
- Читаем мета-значение
_product_origin. - Через массив
$categories_mapсопоставляем значение мета-поля с алиасом категории. - Получаем ID категории и присваиваем товару через
wp_set_post_terms.
Проверка результата после внедрения
Чтобы проверить, что автоприсвоение работает корректно:
- Создайте или отредактируйте товар в админке WooCommerce.
- Добавьте или измените мета-значение
_product_originс помощью плагина Advanced Custom Fields или черезupdate_post_meta($product_id, '_product_origin', 'imported'). - Сохраните товар.
- Перейдите на страницу редактирования товара и проверьте, что категория автоматически назначилась.
- Также можно проверить через SQL или WP CLI:
wp term relationship list <post_id>— должно показывать ID нужной категории.
Частые ошибки и как исправить
- Категория не назначается: проверьте, что slug категории точно совпадает с тем, что указан в
$categories_map. Ошибка в регистре или опечатка приведет к пропуску. - Метаполе не читается: убедитесь, что метаполе
_product_originдействительно существует и заполнено, а не пустое. - Автоприсвоение сбрасывает текущие категории: параметр
falseвwp_set_post_termsочищает старые категории. Если нужно добавить категорию к уже назначенным, передавайтеtrueи объединяйте термы. - Код не срабатывает при импорте: если импорт идет напрямую в базу, хук не вызывается. Используйте функции WP для импорта или добавьте вызов вручную.
Практические советы по производительности и безопасности
- Добавляйте проверку
current_user_can('edit_post', $post_id), если нужно ограничивать применение автоприсвоения только при действиях админов. - Не используйте тяжелые запросы внутри функции, чтобы не замедлять сохранение товара.
- Если много условий — используйте кеширование ID терминов для уменьшения количества запросов к базе.
Сравнение вариантов реализации автоприсвоения категорий
| Вариант | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Хук save_post_product | Простота, работает на любом сохранении товара | Не срабатывает при прямом SQL импорте | Подходит для мелких проектов и ручного ввода |
| Фильтр при импорте через WP All Import | Интеграция с импортом, гибкость | Зависит от плагина, требует настройки | Большие объемы импорта товаров |
| Плагин автоприсвоения категорий | Готовое решение, поддержка | Нагрузка, лишний код, лицензия | Для непрофессиональных пользователей |