wpcat.ru wordpress WPCat.ru

WooCommerce: автоматическое присвоение категорий и атрибутов товарам по условиям

Задача: как автоматически присвоить категории и атрибуты новым товарам в 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().
  • Атрибут не отображается на странице товара: убедитесь, что атрибут установлен как видимый и не является вариативным, если это не нужно.

Практические советы по безопасности и производительности

  • Всегда делайте резервную копию перед внесением изменений в код.
  • Не используйте тяжелые запросы в хуках сохранения, чтобы не замедлять сохранение товара.
  • Логируйте действия функции для отладки, но отключайте логирование на продакшен-сайте.
  • Если условий много, рассмотрите перенос логики в отдельный класс или плагин для удобства поддержки.

Сравнение вариантов автоматизации присвоения категорий и атрибутов

МетодПлюсыМинусыРекомендуется для
Ручное присвоение через админку Просто, не требует кода Трудоёмко, ошибка человека Небольшие магазины
Плагины автоматизации (типа плагинов импорта) Много функций, интерфейс Нагрузка на сайт, настройка Средние и крупные магазины
Код на хуках (как в статье) Гибко, контролируемо, без лишних плагинов Требует навыков, может усложнить поддержку Разработчики, кастомные решения
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше