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

Решено Импорт из YML

Igorsrt

Форумчанин
Здравствуйте! Пытаюсь импортировать данные из yml (xml) файла с помощью плагина WP All Import Pro и его дополнения WP All Import - WooCommerce Add-On Pro.
Вроде бы все получается, за исключением одного: в xml файле свойства товаров прописаны так:
Код:
<param name="Материал каркаса">металл</param>
<param name="Ортопедическое основание">в комплекте</param>
<param name="Материал ортопедического основания">с деревянными ламелями</param>
<param name="Цвет каркаса">Белый каркас</param>
<param name="Размер спального места">160 х 200 см</param>
Соответственно у каждого товара этих "param name" может быть разное количество и они могут отличаться... Поэтому, я даже не пытаюсь пока "засунуть" их в атрибуты товара, а просто хочу вставить в описание - в результате на странице появляется:
металл
в комплекте
деревянными ламелями
Белый каркас
160 х 200 см
т.е. сами названия свойств не выводятся... Можно ли как-то заставить WP All Import их подцеплять? (вот в этом видео http://www.azoogle.ru/wp-all-import-woocommerce/ у автора параметры выводятся именно так в кратком описании - но как этого добиться, он скромно умолчал)
Или, может быть, есть какой-то специальный плагин для импорта именно из yml?
 

Igorsrt

Форумчанин
решил вопрос путем правки xml файла... жалко что нет более "красивого" способа (
 

pagemaster

Форумчанин
Здравствуйте! Пытаюсь импортировать данные из yml (xml) файла с помощью плагина WP All Import Pro и его дополнения WP All Import - WooCommerce Add-On Pro.
Прошел год)) но все-же поделитесь инфой как импортировали категории (структуру) товаров? Ведь к товару категория указывается в виде ID, а в начале файла идет список категорий и родительских категорий... как сделать "связку" этих ID при импорте? Ведь импортировать все товары в одну большую кучу не вариант...
Или подскажите может встречали плагин чисто для импорта YML?
 

Bender Zadunaiskiy

Новичок
решил вопрос путем правки xml файла... жалко что нет более "красивого" способа (

Есть!
Вчера целый день потратил на поиск решения, шерстил интернет, разбирался в xml....
В итоге догадался случайно.. решение оказалось очень простым:
У Вас есть в файле такой параметр <param name="Материал каркаса">металл</param>, Вы перетаскиваете в поле "описание" сам тег <param> и у Вас импортируется значение "металл"... А надо тыкать мышкой не в сам тег <param>, а в атрибут "name" и его перетаскивать в поле "описание", тогда импортируется само имя атрибута! Синтаксис при этом выглядит вот так {param[1]/@name}

Т.е. в Вашем случае перетаскиваете сначала <param>, затем "name", получится: {param[1]/@name} - {param[1]} , а в карточке товара будет: Материал каркаса - металл

Единственный момент - работает если в поле "дескрипшн" засовывать, пробовал в атрибуты засунуть - не импортируется...
 

pagemaster

Форумчанин
Есть!
Вчера целый день потратил на поиск решения, шерстил интернет, разбирался в xml....
В итоге догадался случайно.. решение оказалось очень простым:
У Вас есть в файле такой параметр <param name="Материал каркаса">металл</param>, Вы перетаскиваете в поле "описание" сам тег <param> и у Вас импортируется значение "металл"... А надо тыкать мышкой не в сам тег <param>, а в атрибут "name" и его перетаскивать в поле "описание", тогда импортируется само имя атрибута! Синтаксис при этом выглядит вот так {param[1]/@name}

Т.е. в Вашем случае перетаскиваете сначала <param>, затем "name", получится: {param[1]/@name} - {param[1]} , а в карточке товара будет: Материал каркаса - металл

Единственный момент - работает если в поле "дескрипшн" засовывать, пробовал в атрибуты засунуть - не импортируется...
На счет характеристик, то нашел способ по проще:
[FOREACH({param})]
{@name} - {.}
[ENDFOREACH]
это цикл, который выводит название и значение всех характеристик, соответственно можно добавить еще html теги для оформления:
HTML:
<ul class="attributes">
[FOREACH({param})]
<li><span class="attribute_name">{@name}</span>: <span class="attribute_value">{.}</span></li>
[ENDFOREACH]
</ul>

а на счет связки категорий по их id, то пока нашел только такое решение:
Screenshot_1.png

в идеале думаю можно написать функцию-обработчик, но моих знаний пока не хватает))
 

pagemaster

Форумчанин
вдруг кому пригодится, код функции конвертации цены с одной валюты в другую в YML файле:
PHP:
function price_converter ($price, $currency){
    if ($currency == "USD") {
        $converted_price = $price * 25.144111; // курс нужно указывать самому
        $converted_price = round($converted_price, 2);
        return $converted_price;
    } else {
        return $price;
    }
}
а в Regular Price вставляем вызов функции: [price_converter({price[1]}, {currencyId[1]})]
 
  • Like
Реакции: ADv

khvoroffski

Новичок
Есть!
Вчера целый день потратил на поиск решения, шерстил интернет, разбирался в xml....
В итоге догадался случайно.. решение оказалось очень простым:
У Вас есть в файле такой параметр <param name="Материал каркаса">металл</param>, Вы перетаскиваете в поле "описание" сам тег <param> и у Вас импортируется значение "металл"... А надо тыкать мышкой не в сам тег <param>, а в атрибут "name" и его перетаскивать в поле "описание", тогда импортируется само имя атрибута! Синтаксис при этом выглядит вот так {param[1]/@name}

Т.е. в Вашем случае перетаскиваете сначала <param>, затем "name", получится: {param[1]/@name} - {param[1]} , а в карточке товара будет: Материал каркаса - металл

Единственный момент - работает если в поле "дескрипшн" засовывать, пробовал в атрибуты засунуть - не импортируется...
Такая конструкция срабатывает, если очередность одна у параметров. А если они в разных офферах по разному расположены, то вот эта еденица в параметре не сработает, нужно проверять именно по имени, т.е. @Name name="Материал каркаса"
 

pagemaster

Форумчанин
Последний раз сталкивался с импортом YML в Woocommerce еще в 2019 году... сейчас 2021 а простого решения проблемы с импортом иерархии категорий я не нашел)) Вот делюсь как делали другие: импортировали сначала таксономии категорий и их ID, а потом отдельно импортировали товары, которые по ID категории уже попадали куда нужно. Прикрепил PDF файл с инструкцией.



Но мне такое решение не понравилось и я решил сделать костыль и пойти сложным путем - парсить категории с хлебных крошек для каждого товара. То есть берем URL товара с тега <url> в нашем YML файле и переходим на страницу товара, где получаем цепочку категорий, в которой находится товар, их же называют "хлебные крошки". Вот мои функции, кто знает регулярки и PHP, тому не составит труда переделать под нужный сайт:
PHP:
// [get_cats({url[1]})] - вызов функции, вставляем в поле категории

function get_cats ($url) {   
    $path = "";   
    $result = get_web_page($url);
    $html = $result['content'];       
    $breadcrumb = between('<span itemprop="name" data-language="breadcrumb_home" title="Главная">Главная</span>', '</ol>', $html); // берем кусок кода с категориями
    $breadcrumb = str_replace("\r", "", $breadcrumb);
    $breadcrumb = str_replace("\n", "", $breadcrumb);
    
    preg_match_all('~\<a itemprop\=\"item\" href\=\".*?\"\>\<span itemprop\=\"name\"\>(.*?)\<\/span\>~', $breadcrumb, $cats); // ищем категории в куске кода с категориями
    foreach ($cats[1] as $cat) {
        $path .= $cat.">";
    }
            
    $path = preg_replace("/\>$/", "", $path); // удаляем ">" в конце строки, если он есть)
    return $path; // функция возвращает категории в виде "Одежда>Для женщин>Майки"
}


// и вот доп.функции для получения кода страницы и его обрезания:
// ============ функция скачивания страницы через cURL ==================
function get_web_page($url){
  $uagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)";

  $ch = curl_init( $url );
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   // возвращает веб-страницу
  curl_setopt($ch, CURLOPT_HEADER, 0);           // не возвращает заголовки
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   // переходит по редиректам
  curl_setopt($ch, CURLOPT_ENCODING, "");        // обрабатывает все кодировки
  curl_setopt($ch, CURLOPT_USERAGENT, $uagent);  // useragent
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения
  curl_setopt($ch, CURLOPT_TIMEOUT, 120);        // таймаут ответа
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);       // останавливаться после 10-ого редиректа
  curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__)."/cookie.txt");
  curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__)."/cookie.txt");

  $content = curl_exec( $ch );
  $err     = curl_errno( $ch );
  $errmsg  = curl_error( $ch );
  $header  = curl_getinfo( $ch );
  curl_close( $ch );

  $header['errno']   = $err;
  $header['errmsg']  = $errmsg;
  $header['content'] = $content;
  return $header;
}
// ===============================================

// ================== Функции обрезки текста в строке =======================
function after ($after, $string){      // указываем с чего начинается нужный нам кусок
    if (!is_bool(strpos($string, $after)))
    return substr($string, strpos($string,$after)+strlen($after));
}
function before ($before, $string){ // указываем чем заканчивается нужный нам кусок
    return substr($string, 0, strpos($string, $before));
}
function between ($after, $before, $string){
    return before ($before, after($after, $string));
}
// ==========================================================================

Поделился самым ценным))
Если вы не умеете или не хотите разбираться в коде, пишите на page-master[собака]ukr.net, за вознаграждение помогу.
 

Вложения

  • import-yml-format-rus.pdf
    135.5 KB · Просмотры: 41

pagemaster

Форумчанин
И вот еще функция для наличие товара:
PHP:
// [checkAvailable({./@available})] - вызов функции

function checkAvailable ($available) {
    if ($available == "true") {
        $stock = "instock";
    } else {
        $stock = "outofstock";
    }
    return $stock;
}
Она проверяет какое наличие стоит, если "true" то возвращает "instock" (так требует модуль), если другое - "outofstock". Куда вставлять вызов функции думаю сами разберетесь)
 

fsjorka

Новичок
И вот еще функция для наличие товара:
PHP:
// [checkAvailable({./@available})] - вызов функции

function checkAvailable ($available) {
    if ($available == "true") {
        $stock = "instock";
    } else {
        $stock = "outofstock";
    }
    return $stock;
}
Она проверяет какое наличие стоит, если "true" то возвращает "instock" (так требует модуль), если другое - "outofstock". Куда вставлять вызов функции думаю сами разберетесь)
Добрый день, " Куда вставлять вызов функции думаю сами разберетесь) " подскажите пожалуйста, а то уже все перепробывал все "равно нет в наличии"((((
 

BashOrgRu

Новичок
Для меня стало открытием, что в ситуации "нестабильного множества параметров" (когда их много и в разных товарах на одном и том же месте находятся разные параметры param name) надо не перетаскивать мышкой, а прописывать параметры в таком виде: {param[@name=”Цвет”]}.
Огромная благодарность каналу Финты WordPress, без которых я бы, наверное, еще не один месяц тупил, пытаясь разобраться с синтаксисом.
Вот видео: WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров
UPD. Не-е. Не работает :(( Хотя выглядело убедительно
 
Последнее редактирование:
  • Like
Реакции: ADv

metaworklawyer

Новичок
И вот еще функция для наличие товара:
PHP:
// [checkAvailable({./@available})] - вызов функции

function checkAvailable ($available) {
    if ($available == "true") {
        $stock = "instock";
    } else {
        $stock = "outofstock";
    }
    return $stock;
}
Она проверяет какое наличие стоит, если "true" то возвращает "instock" (так требует модуль), если другое - "outofstock". Куда вставлять вызов функции думаю сами разберетесь)
наличие товара available="true" - если есть в наличии
если нет в наличии то available=""

Как прописать подскажите пожалуйста такие условия?
 

Danma

Новичок
Для меня стало открытием, что в ситуации "нестабильного множества параметров" (когда их много и в разных товарах на одном и том же месте находятся разные параметры param name) надо не перетаскивать мышкой, а прописывать параметры в таком виде: {param[@name=”Цвет”]}.
Огромная благодарность каналу Финты WordPress, без которых я бы, наверное, еще не один месяц тупил, пытаясь разобраться с синтаксисом.
Вот видео: WP All Import. Эпизод 3. Импорт из XML- и YML-файлов простых и вариативных товаров
UPD. Не-е. Не работает :(( Хотя выглядело убедительно
Там в комментариях к видео этот момент описывался.
Вставляете в в function.php и всё начинает работать с параметрами (сам с такой проблемой столкнулся и это помогло):
Код:
/**
 * Позволяет получать данные из русских атрибутов {param[@name="Цвет"]}
 *
 * @param $is_enabled
 *
 * @return bool
 */
function roomble_is_xml_preprocess_enabled( $is_enabled ) {
    return false;
}
add_filter( 'is_xml_preprocess_enabled', 'roomble_is_xml_preprocess_enabled', 10, 1 );
 

Bulo4ka

Новичок
Добрый день, " Куда вставлять вызов функции думаю сами разберетесь) " подскажите пожалуйста, а то уже все перепробывал все "равно нет в наличии"((((
присоединяюсь к вопросу выше, как и где прописать чтобы остатки считались от условия available="true", потому что отдельно поля количества нет , только либо true либо пусто. кто нибудь подскажет? прописываю это условие в Function Editor ничего не срабатывает
 

Dolphin

Новичок
Подскажите пжлста, вставляю атрибуты в описание через
[FOREACH({param})]
<li><span class="attribute_name">{@name}</span>: <span class="attribute_value">{.}</span></li>
[ENDFOREACH]
И мне нужно чтоб один из параметров не брался конкретней это такой
<param name="Бренд">1111</param>
Как это можно реализовать?
 

Dolphin

Новичок
Никак не выходит добиться результата
[FOREACH({param})]
[IF({@name} != "Бренд")]{
<li><span class="attribute_name">{@name}</span>: <span class="attribute_value">{.}</span></li>
}
[ENDIF]
[ENDFOREACH]
 

pt070

Новичок
Мне кажется, что вы пошли по очень сложному пути. В вордпресе есть готовый плагин Import from YML, который справляется с этой задачей https://wordpress.org/plugins/import-from-yml. По крайней мере я пользуюсь им.
 
Сверху Снизу