/ Адаптивность / Импорт товаров из YML-файла

Импорт товаров из YML-файла

HIT

Импорт файла форма YML имеет ряд существенных особенностей при импорте. Разберем подробно эти особенности.

Импорт категорий

YML файл имеет отдельную структуру категорий

<categories>
	<category id="253">Одежда и аксессуары</category>
	<category id="267" parentId="253">Женская одежда</category>
	<category id="278" parentId="267">Блузы и туники</category>
	<category id="273" parentId="267">Платья</category>
	<category id="729" parentId="267">Брюки женские</category>
	<category id="724" parentId="267">Термобелье</category>
	<category id="277" parentId="267">Жакеты и кардиганы</category>
	<category id="274" parentId="267">Комплекты одежды</category>
	<category id="275" parentId="267">Юбки</category>
</categories>

А у товаров указан ID категории из этой структуры:

<offer available="true" group_id="117252" id="117252">
	<categoryId>277</categoryId>
	<currencyId>RUR</currencyId>
	<modified_time>1628088987</modified_time>
	<name>Кардиган с втачным рукавом</name>
	<param name="Цвет">розовый</param>
	<param name="Размер" unit="RU">46</param>
	<pickup>false</pickup>
	<picture>https://www.leomax.ru/upload/iblock/727/72797d09625027e914406703ffd2b809.jpg</picture>
	<picture>https://www.leomax.ru/upload/iblock/d2d/d2ddbea8a63c7212e30bb70ea33e438d.jpg</picture>
	<price>4590</price>
	<vendor>Elletto Life</vendor>
</offer>

Так вот, для дальнейшего импорта товаров, необходимо сначала сделать импорт категорий.

  1. Создаем новый импорт. В пункте выбора что создавать выбираем Таксономии, а ниже Категории товаров.
  2. На втором шаге из списка выбираем category. Надо следить чтобы в правой части высвечивалась строка с категорий, бывают глюки при выборе данной строки.

3. В наименовании категории указывает саму строку {.}

В term meta прописываем мета _category_id и подставляем значение атрибута id:

{./@id}

Это будет нужно для построения правильной вложенности категорий.

В Parent Term прописываем конструкцию:

[IF({./@parentId[.!=""]})][my_get_category({./@parentId})][ELSE][ENDIF]

Ниже в Function Editor прописываем функцию на которую идет ссылка выше:

function my_get_category( $id ) {
	$term = get_terms( array(
		'taxonomy' => 'product_cat',
		'hide_empty' => false,
		'meta_query' => array(
			array(
				'key' => '_category_id',
				'value' => $id,
				'compare' => '='
			)
		)
	)
					 );
	if ( ! empty( $term ) ) {
		return $term[0]->slug;
	}
}

Таким образом на каждом шаге при создании категорий мы заводим для каждой _category_id а потом с помощью функции подставляем нужную категорию как родительскую.

Переходим к следующему шагу.

4. На последнем шаге прописываем уникальный идентификатор

{./@id}

и самое главное указываем количество итераций (In each iteration, process) = 1. Это нужно для правильной работы функции из предыдущего шага.

Импорт товаров

При импорте товаров указываем как обычно в начале товары, на втором шаге выбираем пункт offer.

Чтобы категории правильно назначались товарам используем ту же функцию my_get_category, она уже будет прописана в Function Editor.

Указываем в поле категория:

[my_get_category({categoryId[1]})]

Включаем чекбокс «Искать категории из существующих», иначе категории будут создаваться новые без иерархии.

Если изображений в фиде несколько, прописываем их через запятую:

Импорт атрибутов

Атрибуты могут иметь следующий вид:

<offer available="true" group_id="1995091" id="1995091">
	<categoryId>273</categoryId>
	<currencyId>RUR</currencyId>
	<modified_time>1628088987</modified_time>
	<name>Платье «Мерлин»</name>
	<param name="Размер" unit="RU">50</param>
	<param name="Цвет">золотой</param>
	<param name="Вид застежки">без застежки</param>
	<param name="Стиль">вечерний</param>
	<param name="Материал">полиэстер</param>
	<param name="Модель">фантазийная</param>
	<param name="Горловина">V-образная</param>
	<param name="Длина">миди</param>
	<param name="Длина рукава">три четверти</param>
	<param name="Сезон">Демисезон</param>
	<pickup>false</pickup>
	<picture>https://www.leomax.ru/upload/iblock/665/665c6c7226c68896b23d3e45a91c4adc.jpg</picture>
	<price>2999</price>
	<vendor>BlagoF</vendor>
</offer>

XPath не позволяет делать запросы с кириллическими символами, если не отключить предварительную обработку XML, добавив этот код в файл functions.php

// Использовать при импорте кириллические символы
function wpai_is_xml_preprocess_enabled( $is_enabled ) {
	return false;
}
add_filter( 'is_xml_preprocess_enabled', 'wpai_is_xml_preprocess_enabled', 10, 1 );

Теперь будет возможность подставлять атрибуты таким образом:

{param[@name="Тип снаряжения"]}
{param[@name="Рулевая колонка"]}
{param[@name="Педали"]}

Если не отключать предварительную проверку также есть 2 сценария импорта атрибутов.

Первый сценарий (более универсальный, но значения атрибутов не должны иметь запятых, т.е. одно значение)

Прописываем функцию в Function Editor:

function map_params( $names, $values, $key ) {
	if ( empty( $key ) ) return ''; 

	$result = '';
	$names_arr = explode( ",", $names );
	$values_arr = explode( ",", $values );

	if ( ! empty( $names_arr ) ) {
		foreach ( $names_arr as $i => $name ) { 
			if ( trim( pmxi_convert_encoding( $name, "UTF-8" ) ) == $key ) {
				$result = isset( $values_arr[ $i ] ) ? trim( $values_arr[ $i ] ) : '';
				break;
			}
		}
	}
	return $result;
}

Атрибуты прописываем так:

[map_params({param/@name},{param},"Рулевая колонка")]

Пример:

Значения атрибута, например «3,6 л» отсекается после запятой, в атрибут попадает только «3».

Второй сценарий (в функции нужно прописывать каждый атрибут, но можно использовать для значений с запятыми, т.е. с несколькими значениями)

Прописываем функцию в Function Editor:

function add_param_nodes( $node ) {
    $results = $node->xpath( 'param' );
	  $att = 'name';
    if ( !empty( $results ) ) {
        foreach( $results as $result ) {
			$atts = (string) $result->attributes();
			$atts = trim( pmxi_convert_encoding( $atts, "UTF-8" ) );
			if ( ! empty( $atts ) && $atts == 'Возраст' ) {
				$node->addChild( 'Возраст', $result->__toString() );
			} elseif ( ! empty( $atts ) && $atts == 'Пол' ) {
				$node->addChild( 'Пол', $result->__toString() );
			} elseif ( ! empty( $atts ) && $atts == 'Размер' ) {
				$node->addChild( 'Размер', $result->__toString() );
			}
		}
    }
    return $node;
}
add_filter( 'wpallimport_xml_row', 'add_param_nodes', 10, 1 );

В подстановке используются так:

{Рулеваяколонка[1]}
{Педали[1]}

Импорт цены со скидкой

Попадаются фиды в которых есть поля price и oldprice. Oldprice заполнен не у всех товаров, price у всех. Сложность импорта в том, что система Woocommerce работает от обратного. т.е. есть базовая цена и есть цена со скидкой. А в данном случае если заполнено поле oldprice то его нужно подставлять в базовую цену а базовую цену в скидку.

Вот что нужно прописать в полях цен в подобном случае:

Regular Price:
[IF({oldprice[1][.!=""]})]{oldprice[1]}[ELSE]{price[1]}[ENDIF]

Sale Price:
[IF({oldprice[1][.!=""]})]{price[1]}[ENDIF]

Обновление товаров

При обновлении товаров указываем уникальным идентификатором поле _sku с значением id товара:

{./@id}

И ниже включаем только те поля которые необходимо обновить, если выбрать все поля то обновления может не произойти.

При импорте большого количества изображений в каждом товаре рекомендуется уменьшить значение итераций с 20 на меньшее, чтобы не получить отказ сервера (timeout).

[site-socialshare]
  • Комментарии
  • Вложения

Добавить комментарий

Пока нет комментариев. Будь первым!

Импорт товаров из YML-файла Импорт товаров из YML-файла Импорт товаров из YML-файла Импорт товаров из YML-файла Импорт товаров из YML-файла
Посты — метки на карте
Рекомендации для васПосты — метки на картеOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.