MODX. XML feed. Minishop2.

Оглавление

В статье рассмотрим как создать фид с помощью стандартных сниппетов miniShop2. 

Но стоит учитывать, что данный метод предназначен для небольших магазинов! Где кол-во товаров не превышает 3-5 тысяч!

Подразумевается что товары реализованы через minishop2.

  • Создаем шаблон, например yml.xml
    <?xml version="1.0" encoding="windows-1251"?>
    <yml_catalog date="[[!+nowdate:default=`now`:strtotime:date=`%Y-%m-%d %H:%M`]]" >
        <shop>
            <name>[[++site_name]]</name>
            <company>[[++site_name]]</company>
            <url>[[++site_url]]</url>
            <currencies>
                <currency id="RUR" rate="1"/>
            </currencies>
            <categories>
                [[pdoResources? &parents=`7` &depth=`10` &limit=`0` &where=`{"template:":16}` &tpl=`categories.yml`]]
            </categories>
            <offers>
                [[msProducts? &parents=`7` &limit=`0` &where=`{"template:":16}` &includeTVs=`seo_h1,seo_desc` &includeThumbs=`medium` &tpl=`offers.yml`]]
            </offers>
        </shop>
    </yml_catalog>    
    

    В данном случае мы указываем что ID родителя = 7, глубина выборки 10, без лимита по кол-ву, только страницы с шаблоном 16 (id) и указываем шаблон вывода категорий categories.yml

  • Создаем страницу yml.xml
    В Настройках страницы выбираем Тип содержимого - XML и замораживаем URL
    Выбираем новый шаблон
  • Создаем чанк categories.yml 
    <category id="[[+id]]" [[+parent:is=`7`:then=``:else=`parentId="[[+parent]]"`]]>[[+pagetitle]]</category> 
    

    Здесь стоит обратить внимание на конструкцию
    [[+parent:is=`7`:then=``:else=`parentId="[[+parent]]"`]]       
    

    Она нужна для того, что бы указывать вложенность категорий если они вложены не в родителя, вместо 7 здесь у вас будет свой ID родительской категории
  • Далее мы выводим список всех товаров
    <offers>
       [[msProducts? &parents=`7` &limit=`0` &where=`{"template:=":5}` &includeTVs=`seo_h1,seo_desc` &includeThumbs=`medium` &tpl=`offers.yml`]]
    </offers>  
    

    Здесь мы указываем общую родительскую категорию, лимит, шаблонов товаров (id 5) что бы вы выдачу не попали категории, перечисляем TV которые нам понадобятся в шаблоне товара (они индивидуальны в зависимости от сайта) и указываем шаблон чанка offers.yml
  • Создаем чанк offers.yml
    [[+price:gt=`0`:then=`
        <offer id="[[+id]]" available="true">
            <url>[[++site_url]][[~[[+id]]]]</url>
            <price>[[+price:stripString=` `]]</price>
            [[+old_price:notempty=`
                <oldprice>[[+old_price:stripString=` `]]</oldprice>
            `:default=` `]]
            <currencyId>RUR</currencyId>
            <categoryId>[[+parent]]</categoryId>
            <picture>https://reshetki-na-okna.ru[[+thumb:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]</picture>
            <name>[[+pagetitle]]</name>
            <vendorCode>[[+article]]</vendorCode>
            [[msProductOptions?
                &product=`[[+id]]`
                &onlyOptions=`список_свойств`
                &tpl=`offers-params.yml`
            ]]
            <delivery>true</delivery>
            <description>[[+description:escape:striptags]]</description>
        </offer>
    `:else=` `]]
    Чанк offers-params.yml
    {foreach $options as $option}
        <param name="{$option.caption}" unit="{$option.measure_unit}">
            {if $option.value is array}
                {$option.value | join : ', '}
            {else}
                {$option.value}
            {/if}
        </param>
    {/foreach}
    

Если у вас крупный магазин, то выгрузка должна разбиваться на несколько частей, сразу все товары обработать ваш хостер скорее всего не сможет, для этого вам пригодится пакет modstore.pro/packages/import-and-export/yandexmarket2