Лаборатория Кода, Маркетинг-Код

YML-файл для трансляции товаров на Яндекс.Маркете (скрипт для osCommerce 2.3)

Рано или поздно для интернет-магазинов (или просто магазинов-салонов) может возникнуть необходимость вывода товаров на Яндекс.Маркет. По статистике Яндекса (июнь 2011), более 9 млн. покупателей по всей России выбирают Яндекс.Маркет, чтобы сравнить цены и найти лучшее предложение для себя.

yandex-market - добавить магазин

Для трансляции товаров из магазинов, Яндекс.Маркет требует загрузить прайс-лист в особом формате — YML (на самом деле, его можно генерировать с помощью языка программирования — в моем случае, PHP, -подобно родительному XML-формату). О создании такого файла для движка osCommerce читаем под катом.

После регистрации магазина на Яндекс.Маркете, требуется ввести ссылку на ваш прайс-лист. Это ссылка, которая будет иметь своим содержанием заранее приготовленный файл (в нашем случае, «ya-market.php»).

пишем прайс-лист для Яндекс.Маркет в YML-формате

В интернете я нашла некоторые «готовые решения» для osCommerce, но они, в итоге, оказались непригодными. Поэтому мне пришлось полностью переписывать один из найденных php-файлов. Выкладываю то, что получилось.

Для начала, определяем header файла. Информация о всех наших товарах записана в базу данных MySQL, — подключаемся к ней: вводим нужные значения в соответствующие поля и устанавливаем соединение.

<?
/**************************************************
* Скрипт ya-market.php для выгрузки товаров в формате YML для интернет-магазина на движке osCommerce 2.3
* Дата разработки: 25 июня 2011
* Разработчик: Володина Нина
* Сайт: www.codda.ru

// Скрипт распространяется по лицензии GNU.
// Вы можете использовать скрипт на свой страх и риск. За любые ошибки разработчики отвественности не несут.
**************************************************/

header('Content-type: application/xml');
header("Content-Type: text/xml; charset=utf-8");

$kurs=$currency_value[0];

  define('DB_HOST', '');//Вписать сервер бд
  define('DB_USER', '');//Вписать имя пользователя
  define('DB_PASS', '');//Вписать пароль
  define('DB_NAME', '');//Вписать имя базы данных

$ctt = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
$db = mysql_select_db(DB_NAME) or die("Ошибка базы данных");
mysql_query ("SET NAMES 'latin1'");

В моем случае, корректная кодировка для работы с БД — latin1. Если у вас по умолчанию задействована другая кодировка, используйте ее имя в определении передачи данных.

Начинаем генерировать XML. Определяем переменные для заголовка (название интернет-магазина, адрес сайта, описание), а также текущую валюту.

#########################
# Начинаем генерировать XML
# переменные для заголовка
$cdate = date("Y-m-d H:i",time());
$csite = "http://www.moy-sayt.ru/";//Вписать адрес интернет-магазина
$cname = "";//Вписать название интернет-магазина
$csite2 = $csite;
$cname2 = $cname;
$cdesc = "";//Вписать описание интернет-магазина
#----------------------------------------------
$yandex=<<<END
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="$cdate">

<shop>
<name>$cname</name>
<company>$cdesc</company>
<url>$csite</url>

<currencies>
    <currency id="RUR" rate="1"/>
</currencies>
END;

Приступаем к выводу категорий и подкатегорий для Яндекса. Т.к. по специфике osCommerce, данные о категориях разъединены на 2 таблицы (ID родительской категории хранится в таблице «categories», а название категории — в «categories_description»), нам нужно отправить запрос к обеим из них, идентифицируя каждую по ID.

$arr_cats=array();
#----------------------------------------------
    # для Яндекса выводим все подкатегории
        $yandex .= "\n\n<categories>\n";
        $tmp="
                select
                        c.categories_id as categoryID, cd.categories_name as name, c.parent_id as parent
                FROM
                        categories as c, categories_description as cd where c.categories_id = cd.categories_id AND cd.language_id=2
                ORDER BY
                        parent, name";

        $res = mysql_query($tmp);
        while ($rezzzz = mysql_fetch_array($res)){
                #экранируем спецсимволы

                $rezzzz['name']=htmlspecialchars($rezzzz['name']);
                $fftt = "    <category id=\"".$rezzzz['categoryID']."\"";
                if($rezzzz['parent']>0)        $fftt .= " parentId=\"".$rezzzz['parent']."\"";
                $fftt.= ">".$rezzzz['name']."</category>\n";
                $yandex .= $fftt;

                $arr_cats[$rezzzz['categoryID']]=$rezzzz;
        }
        $yandex .= "</categories>\n";
#----------------------------------------------
$yandex .="\n<offers>\n";

#----- YANDEX ------

Аналогично категориям, для вывода товаров, мы будем использовать запрос к двум основным таблицам («products» и «products_description»), а также к таблице по «привязке» товара к категориям — «products_to_categories». Мы будем выводить только те товары, у которых цена больше нуля (p.products_price>0) и статус которых равен 1 (утвержденные товары — p.products_status=1), на русском языке (pd.language_id=2).

$tmp="
        select
                p.products_id AS productID,
                p.products_price AS Price,
                p.products_image AS picture,
                p.products_status AS in_stock,
                pd.products_id,
                pd.products_name AS name,
                pd.products_description AS brief_description,
                pc.categories_id AS categoryID,
                pc.products_id
        FROM
                 products AS p,
                 products_description AS pd,
                 products_to_categories AS pc
        WHERE
                p.products_price>0
                AND pd.products_id=p.products_id
                AND pc.products_id=p.products_id
                AND p.products_status=1
                AND pd.language_id=2
        ORDER BY name";

$res = mysql_query($tmp);

while ($tovar = mysql_fetch_array($res)) {

        $valuta="RUR";//изменить на нужную валюту
        $price=$tovar[Price];

        $price=intval($price);

        $description=htmlspecialchars(strip_tags($tovar[brief_description]));

        $tovar['name'] = htmlspecialchars($tovar['name']);

        #фотография
        if ($tovar['picture'] != "") {
        $src_file = $csite."catalog/images/".$tovar['picture'];
        $ppy = "<picture>".$src_file."</picture>";
        } else {
                $ppy = "";
        }

#----------------------------------------------
$yandex.=<<<END
    <offer id="$tovar[productID]" available="true">
      <url>{$csite}catalog/$tovar[categoryID]-p-$tovar[productID].html</url>
      <price>$price</price>
      <currencyId>$valuta</currencyId>
      <categoryId>$tovar[categoryID]</categoryId>
          $ppy
      <name>$tovar[name]</name>
      <description>$description</description>
    </offer>
END;
}

$yandex .= "</offers>\n</shop>\n</yml_catalog>\n";

#выводим, что нагенерили
echo $yandex;

?>

Примечание. Скрипт был написан специально под osCommerce с тюнинговой сборкой (см. Тюнинг osCommerce v.2.3) . Возможны некоторые несовпадения с базовой версией osCommerce 2.3.

Официальное описание YML от Яндекса.

То, что у нас должно получиться (для сокращения кода, из списка убраны ряд фрагментов <offer></offer>):

<yml_catalog date="2011-07-06 19:57">
−
<shop>
−
<name>
Колесные диски и шины
</name>
<company>Продажа шин и дисков для иномарок премиум класса</company>
<url>http://www.moy-sayt.ru/</url>
−
<currencies>
<currency id="RUR" rate="1"/>
</currencies>
−
<categories>
<category id="90">ДИСКИ</category>
<category id="91">ШИНЫ</category>
<category id="98" parentId="90">Диски AUDI</category>
<category id="110" parentId="90">Диски BENTLEY</category>
<category id="97" parentId="90">Диски BMW</category>
<category id="108" parentId="90">Диски CADILLAC</category>
<category id="109" parentId="90">Диски CHEVROLET</category>
<category id="111" parentId="90">Диски HUMMER</category>
<category id="106" parentId="90">Диски INFINITY</category>
<category id="101" parentId="90">Диски LAND ROVER</category>
<category id="103" parentId="90">Диски LEXUS</category>
<category id="96" parentId="90">Диски MERCEDES</category>
<category id="107" parentId="90">Диски NISSAN</category>
<category id="102" parentId="90">Диски PORSCHE</category>
<category id="105" parentId="90">Диски SUBARU</category>
<category id="104" parentId="90">Диски TOYOTA</category>
<category id="99" parentId="90">Диски VOLKSWAGEN</category>
<category id="100" parentId="90">Диски VOLVO</category>
<category id="189" parentId="91">Б/У покрышки</category>
<category id="188" parentId="91">Шины. Зима</category>
<category id="187" parentId="91">Шины. Лето</category>
</categories>
−
<offers>
−
<offer id="399" available="true">
<url>http://www.moy-sayt.ru/catalog/187-p-399.html</url>
<price>11000</price>
<currencyId>RUR</currencyId>
<categoryId>187</categoryId>
−
<picture>
http://www.moy-sayt.ru/catalog/images/ДУИЛЕР_diski.jpg
</picture>
<name>Bridgestone Dueler H/P Sport</name>
−
<description>

	265-50-19

	ЦЕНА УКАЗАНА ЗА 1 КОЛЕСО

	Bridgestone Dueler H/P Sport- летняя шина для автомобилей 4x4 предназначена для езды на высоких скоростях по трассам и шоссе и входит в первичные комплектации автомобилей Audi Q7, Porsche Cayanne, VW Touareg, обновленной BMW X5 и т.д. Dueler H/P Sport - это великолепная управляемость как на мокрой, так и на сухой дороге. Если Вы хотите приблизить характер Вашего внедорожника к легковому автомобилю и любите динамичную езду, то Вы обязательно оцените шины Dueler H/P Sport, особенно учитывая комфорт и бесшумность, которые они обеспечивают.
</description>
</offer>
−
<offer id="402" available="true">
<url>http://www.moy-sayt.ru/catalog/187-p-402.html</url>
<price>17500</price>
<currencyId>RUR</currencyId>
<categoryId>187</categoryId>
−
<picture>
http://www.moy-sayt.ru/catalog/images/conticrosscontactuhp_diski.jpg
</picture>
<name>Continental CrossContact UHP</name>
−
<description>

	295-35-21

	ЦЕНА УКАЗАНА ЗА 1 КОЛЕСО 

	Continental имеет в своем арсенале шины, специально разработанные для супермощных 4WD автомобилей - шины ContiCrossContact UHP.
	Их технические характеристики, включая кратчайший тормозной путь и исключительные показатели устойчивости при поворотах на больших скоростях и прекрасная управляемость, делают их незаменимыми для таких требовательных автомобилей 4WD, как: Porsche Cayenne, BMW X5, Range Rover Sport и т. д. Это покрывает большую часть рынка в области размеров для тюнинга, а также спроса на высокоскоросные шины классов V, W, Y, и Z (с индексами скорости от 210 км/ч до более 300км/ч).
</description>
</offer>
−
<offer id="528" available="true">
<url>http://www.moy-sayt.ru/catalog/187-p-528.html</url>
<price>5250</price>
<currencyId>RUR</currencyId>
<categoryId>187</categoryId>
−
<picture>
http://www.moy-sayt.ru/catalog/images/DEREZA_diski.jpg
</picture>
<name>dUNLOP DIREZZA DZ101 215/55 R17</name>
−
<description>

	Одна из последних разработок японского завода Dunlop.

	Шина произведена по усовершенствованной фирменной технологии DIGI-TYRE, получившей название Digital Rolling Simulation II:

		ещё меньший тормозной путь;

		ещё большее пятно контакта и, как следствие, великолепная устойчивость на высоких скоростях;

		потрясающее сцепление с мокрой дорогой;

		ещё меньшее сопротивление качению - меньший износ и экономия топлива;

		ещё меньший уровень шума.

	Это шина, в первую очередь, ориентирована на любителей спортивного типа вождения, но, естественно, её можно рекомендовать абсолютно всем автомобилистам.
</description>
</offer>
−
<offer id="529" available="true">
<url>http://www.moy-sayt.ru/catalog/187-p-529.html</url>
<price>5300</price>
<currencyId>RUR</currencyId>
<categoryId>187</categoryId>
−
<picture>
http://www.moy-sayt.ru/catalog/images/DUNLOP_SP_Sport_230-500x500_diski.jpg
</picture>
<name>DUNLOP SP SPORT 230 215/55 R17</name>
−
<description>

	Используя инновационный дизайн трехсегментного протектора, компания Dunlop разработала новую модель шин - SP Sport 230, которая позволяет обеспечить плавность хода и высокий уровень безопасности. Новая модель шин подойдет и для любителей спортивного стиля вождения. Разделение протектора на три зоны обеспечивает оптимальное поведение автомобиля на дороге вне зависимости от состояния дорожного покрытия и дорожных условий. Это делает представленную модель шин идеальной для автомобилей верхнего сегмента среднего класса, а также для седанов класса люкс.
</description>
</offer>
</offers>
</shop>
</yml_catalog>
//Вписать свой адрес магазина
Этот материал опубликован в Лаборатория Кода, Маркетинг-Код и тегирован , , , . Bookmark the permalink.

7 отзывов на YML-файл для трансляции товаров на Яндекс.Маркете (скрипт для osCommerce 2.3)

  1. codda говорит:

    Проверка

  2. Юрий говорит:

    Спасибо, попробую прикрутить

  3. Андрей говорит:

    спасибо! взял себе

  4. ledirene говорит:

    Пишу скрипт экспорта для joomshopping. Как видно из примера, в description товара яндексом будут учитываться системные переводы строк (не html-теги)? т.к. в описании http://help.yandex.ru/partnermarket/?id=1111425 об этом ничего нет. Спасибо, очень интересный сайт)))

  5. webwride говорит:

    Благодарю, Вы очень помогли! Как раз искал что то похожее))) будем разбираться!

  6. Владимир говорит:

    Спасибо, думал уже не найду.
    Правда я делаю на самописной cms, что усложняет работу и приходится переделывать, но скрипт супер!

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>