Импорт файла форма 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>
Так вот, для дальнейшего импорта товаров, необходимо сначала сделать импорт категорий.
- Создаем новый импорт. В пункте выбора что создавать выбираем Таксономии, а ниже Категории товаров.
- На втором шаге из списка выбираем 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},"Рулевая колонка")]
Пример:
Второй сценарий (в функции нужно прописывать каждый атрибут, но можно использовать для значений с запятыми, т.е. с несколькими значениями)
Прописываем функцию в 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]