Задача: как автоматически присвоить категории и атрибуты новым товарам в WooCommerce
В магазинах на WooCommerce часто требуется автоматизировать процесс классификации товаров. Например, при добавлении товара через админку или импорт, нужно автоматически присвоить определённые категории и атрибуты в зависимости от свойств товара (названия, описания, цены и т.п.). Это помогает поддерживать структуру каталога без постоянного ручного контроля.
Диагностика проблемы: почему не подходит ручное присвоение категорий и атрибутов
- Ручное назначение категорий и атрибутов занимает много времени при большом ассортименте.
- При массовом импорте товаров легко допустить ошибку или пропустить нужные категории.
- Отсутствие автоматизации ведёт к несогласованности каталога и ухудшению качества фильтров.
Пошаговое решение: добавляем автоматическое присвоение категорий и атрибутов через хук WooCommerce
Для решения задачи используем хук save_post_product, который срабатывает при сохранении товара. В функции проверяем условия и программно добавляем нужные категории и атрибуты.
1. Добавление кода в файл functions.php вашей темы или в отдельный плагин
add_action('save_post_product', 'auto_assign_categories_attributes', 20, 3);
function auto_assign_categories_attributes($post_ID, $post, $update) {
// Защита от бесконечного цикла
remove_action('save_post_product', 'auto_assign_categories_attributes', 20);
// Получаем объект товара
$product = wc_get_product($post_ID);
if (!$product) {
return;
}
$categories_to_add = [];
$attributes_to_add = [];
// Пример условия: если в названии есть слово "спортивный" - добавляем категорию "Спорт"
if (stripos($product->get_name(), 'спортивный') !== false) {
$categories_to_add[] = 'sport'; // slug категории
}
// Пример условия по цене: если цена больше 10000, добавляем атрибут "Премиум"
if ($product->get_price() > 10000) {
$attributes_to_add['pa_uroven'] = 'premium'; // pa_uroven - slug атрибута, premium - slug термина
}
// Добавляем категории, если они не назначены
if (!empty($categories_to_add)) {
$existing_cats = wp_get_post_terms($post_ID, 'product_cat', ['fields' => 'slugs']);
$new_cats = array_unique(array_merge($existing_cats, $categories_to_add));
wp_set_post_terms($post_ID, $new_cats, 'product_cat');
}
// Добавляем атрибуты
if (!empty($attributes_to_add)) {
$product_attributes = $product->get_attributes();
foreach ($attributes_to_add as $attr_name => $term_slug) {
// Проверяем, есть ли уже такой атрибут
if (!isset($product_attributes[$attr_name])) {
$product_attributes[$attr_name] = new WC_Product_Attribute();
$product_attributes[$attr_name]->set_name($attr_name);
$product_attributes[$attr_name]->set_options([$term_slug]);
$product_attributes[$attr_name]->set_position(0);
$product_attributes[$attr_name]->set_visible(true);
$product_attributes[$attr_name]->set_variation(false);
} else {
// Если есть, добавляем термин, если его нет
$existing_terms = $product_attributes[$attr_name]->get_options();
if (!in_array($term_slug, $existing_terms)) {
$existing_terms[] = $term_slug;
$product_attributes[$attr_name]->set_options($existing_terms);
}
}
}
$product->set_attributes($product_attributes);
$product->save();
}
// Восстанавливаем хук
add_action('save_post_product', 'auto_assign_categories_attributes', 20, 3);
}
2. Создание категорий и атрибутов с нужными slug
Убедитесь, что в WooCommerce созданы категории с указанными slug (например, sport) и атрибуты (например, pa_uroven с термином premium). Иначе автоматическое присвоение не сработает.
Проверка результата после внедрения
- Создайте или отредактируйте товар, в названии которого есть слово "спортивный" и цена выше 10 000.
- Сохраните товар и проверьте через админку, что к товару автоматически добавилась категория "Спорт" и атрибут "Премиум".
- Если у вас есть доступ к базе данных, можно проверить таблицы
wp_term_relationships(для категорий) и метаданные товара для атрибутов. - Для отладки добавьте
error_logвнутри функции, чтобы видеть, когда она срабатывает.
Частые ошибки и как исправить
- Категории или атрибуты не создаются: проверьте, что категории и атрибуты с нужными slug реально существуют в WooCommerce.
- Функция не срабатывает: убедитесь, что хук
save_post_productподключен правильно, а функция не отключена другими плагинами. - Бесконечный цикл сохранения: не забудьте удалить и восстановить хук внутри функции, чтобы избежать повторного вызова при
$product->save(). - Атрибут не отображается на странице товара: убедитесь, что атрибут установлен как видимый и не является вариативным, если это не нужно.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию перед внесением изменений в код.
- Не используйте тяжелые запросы в хуках сохранения, чтобы не замедлять сохранение товара.
- Логируйте действия функции для отладки, но отключайте логирование на продакшен-сайте.
- Если условий много, рассмотрите перенос логики в отдельный класс или плагин для удобства поддержки.
Сравнение вариантов автоматизации присвоения категорий и атрибутов
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Ручное присвоение через админку | Просто, не требует кода | Трудоёмко, ошибка человека | Небольшие магазины |
| Плагины автоматизации (типа плагинов импорта) | Много функций, интерфейс | Нагрузка на сайт, настройка | Средние и крупные магазины |
| Код на хуках (как в статье) | Гибко, контролируемо, без лишних плагинов | Требует навыков, может усложнить поддержку | Разработчики, кастомные решения |