В WooCommerce атрибуты являются важной частью описания товаров: они помогают пользователям фильтровать и выбирать нужные варианты. Но если вы работаете с большим количеством товаров и получаете данные из внешних источников, ручное добавление атрибутов становится крайне неэффективным. В этой статье разберём, как создать автоматический импорт атрибутов в WooCommerce с помощью кастомного кода и как можно упростить этот процесс с помощью плагинов.
Почему автоматический импорт атрибутов важен для WooCommerce
Автоматизация импорта атрибутов экономит время и снижает риск ошибок. При частом обновлении ассортимента, например, при загрузке товаров от поставщиков в формате CSV или JSON, необходимо быстро и корректно создавать и обновлять атрибуты.
Без автоматизации приходится вручную создавать атрибуты через админку WooCommerce, что неудобно и не масштабируется. Автоматический импорт позволяет интегрировать WooCommerce с внешними системами и поддерживать актуальность данных.
В большинстве случаев импорт атрибутов идёт вместе с импортом товаров, но можно сделать отдельный скрипт, который будет только обновлять или добавлять атрибуты.
Основные этапы автоматического импорта атрибутов в WooCommerce
1. Получение данных об атрибутах из внешнего источника (CSV, JSON, API и т.п.).
2. Проверка существования атрибутов в базе WooCommerce.
3. Создание новых атрибутов и терминов, если они отсутствуют.
4. Привязка атрибутов к товарам.
Получение и подготовка данных
Для примера возьмём простой CSV-файл с колонками: product_sku, attribute_name, attribute_value.
Парсим CSV, группируем данные по SKU товара, формируем массив атрибутов для каждого товара.
Проверка и создание атрибутов в WooCommerce
WooCommerce хранит атрибуты как таксономии с префиксом pa_. Для создания атрибута необходимо зарегистрировать термин таксономии.
Пример функции для создания атрибута и терминов с префиксом wpmarket_:
function wpmarket_create_attribute($name) {
global $wpdb;
$slug = wc_sanitize_taxonomy_name($name);
$exists = $wpdb->get_var($wpdb->prepare("SELECT attribute_id FROM {$wpdb->prefix}woocommerce_attribute_taxonomies WHERE attribute_name = %s", $slug));
if (!$exists) {
$wpdb->insert(
"{$wpdb->prefix}woocommerce_attribute_taxonomies",
[
'attribute_name' => $slug,
'attribute_label' => $name,
'attribute_type' => 'select',
'attribute_orderby' => 'menu_order',
'attribute_public' => 1
]
);
delete_transient('wc_attribute_taxonomies');
do_action('woocommerce_attribute_added', $wpdb->insert_id);
}
return $slug;
}Эта функция проверяет, есть ли атрибут с таким именем, и если нет — добавляет его в базу WooCommerce.
Далее создаём или получаем термины для значений атрибута:
function wpmarket_create_attribute_term($taxonomy, $term_name) {
if (!term_exists($term_name, $taxonomy)) {
wp_insert_term($term_name, $taxonomy);
}
}Привязка атрибутов к товарам
После создания атрибутов и терминов важно привязать их к конкретным товарам. Для этого используем функцию wp_set_object_terms. Пример кода:
function wpmarket_set_product_attributes($product_id, $attributes) {
$product_attributes = [];
foreach ($attributes as $attr_name => $attr_values) {
$slug = wc_sanitize_taxonomy_name($attr_name);
$taxonomy = 'pa_' . $slug;
wpmarket_create_attribute($attr_name);
foreach ($attr_values as $value) {
wpmarket_create_attribute_term($taxonomy, $value);
}
wp_set_object_terms($product_id, $attr_values, $taxonomy);
$product_attributes[$taxonomy] = [
'name' => $taxonomy,
'value' => implode(' | ', $attr_values),
'position' => 0,
'is_visible' => 1,
'is_variation' => 1,
'is_taxonomy' => 1
];
}
update_post_meta($product_id, '_product_attributes', $product_attributes);
}Эта функция принимает ID товара и массив атрибутов, создаёт таксономии и термины, а затем обновляет метаданные товара.
Пример полного импорта из CSV с использованием кода
Рассмотрим упрощённый пример импорта атрибутов из CSV:
function wpmarket_import_attributes_from_csv($csv_file_path) {
if (!file_exists($csv_file_path)) return;
$handle = fopen($csv_file_path, 'r');
if (!$handle) return;
$header = fgetcsv($handle);
$data = [];
while (($row = fgetcsv($handle)) !== false) {
$row_data = array_combine($header, $row);
$sku = $row_data['product_sku'];
$attr_name = $row_data['attribute_name'];
$attr_value = $row_data['attribute_value'];
if (!isset($data[$sku])) {
$data[$sku] = [];
}
if (!isset($data[$sku][$attr_name])) {
$data[$sku][$attr_name] = [];
}
$data[$sku][$attr_name][] = $attr_value;
}
fclose($handle);
foreach ($data as $sku => $attributes) {
$product_id = wc_get_product_id_by_sku($sku);
if (!$product_id) continue;
wpmarket_set_product_attributes($product_id, $attributes);
}
}Вызовите эту функцию, передав путь к CSV-файлу, и атрибуты автоматически добавятся к товарам.
Использование плагинов для автоматизации импорта атрибутов
Если вы не хотите писать код с нуля, существуют мощные плагины для импорта товаров и атрибутов:
- WPMarket — плагин для автоматического импорта товаров с атрибутами из разных форматов. Позволяет настраивать маппинг атрибутов и автоматизировать обновления.
- WP All Import + WooCommerce Add-On — универсальный инструмент для импорта любых данных, включая атрибуты.
Плагин WPMarket, доступный на wpshop.ru, особенно полезен для регулярного импорта от поставщиков с возможностью тонкой настройки логики.
Советы и рекомендации
1. Всегда делайте резервную копию сайта перед массовым импортом.
2. Для больших объёмов данных используйте пакетный импорт и запускайте скрипты через WP-CLI, чтобы избежать таймаутов.
3. Проверяйте корректность слага атрибутов и терминов, чтобы избежать конфликтов с уже существующими таксономиями.
4. Для тестирования используйте товары с минимальным набором атрибутов, чтобы убедиться в правильности работы импорта.
Обработка ошибок и логирование
Добавляйте логирование во все функции импорта, чтобы фиксировать ошибки и предупреждения. Используйте стандартные функции WordPress для логирования в файл или вывод ошибок в админку.
Заключение
Автоматический импорт атрибутов в WooCommerce — задача, решаемая с помощью грамотного кода и/или специализированных плагинов. Правильно реализованный процесс позволяет поддерживать актуальность каталога, экономить время и повышать качество данных.
Используйте приведённые функции как основу и расширяйте их под свои нужды. А если нужно быстрое решение — попробуйте плагин WPMarket.