среда, 16 ноября 2011 г.

Экспорт товаров из Virtuemart 1.1.9 в Яндекс.Маркет через *.yml файл

В предыдущей статье посвященной повышению ТИЦ и PR сайта за короткие строки, легально и бесплатно я упомянул о создании программы для экспорта товаров из Virtuemart 1.1.9 в *.xml или *.yml файл.

1. Для создания такой программы создайте (можно в блокноте) файл market.yml со следующим содержанием (только не забудьте изменить $cfg_url):


<?php
//***********************************************************
//
// Версия коннектора к Yandex.Market от 18.04.2009
// автор доработок Саид Дашук (dashuk@ngs.ru)
// Версия для Украины - изменил Антон Заниздра [для] http://pobedit.com.ua
// Доработки:
// 1. Подключение к настройкам Joomla (теперь не надо прописывать реквизиты доступа к БД,
//         а достаточно указать конфигурационный файл 'configuration.php')
// 2. Добавлены комментарии для новичков
// 3. ВЫБОРКА ВСЕХ ТОВАРОВ ПРОИСХОДИТ ОДНИМ ЗАПРОСОМ!
// 4. Добавлен шаблон для описания товара (тег <description>)
// 5. Курсы валют, приравнены к курсу ЦБРФ
// 6. Добавлены теги "доставка" и "производитель" (просто мне они нужны, а Вы решайте сами)
// а также: форматирование для удобства кода и вывода и еще что то по мелочам.
//
// Проверялось на Joomla! 1.5.9 Production/Stable / VirtueMart 1.1.2 stable
// Проверялось на Joomla! 1.5.23 / VirtueMart 1.1.9 stable [at] http://pobedit.com.ua
//***********************************************************


// Пропишите относительный путь к 'configuration.php' (он находится в корне Joomla)
// Например: include '../configuration.php';
include 'configuration.php';
$cfg = new JConfig();

//NAME - Короткое название магазина (название, которое выводится в списке найденных на Яндекс.Маркете товаров.
//Не должно содержать более 20 символов). Нельзя использовать слова, не имеющие отношения к
//наименованию магазина ("лучший", "дешевый"), указывать номер телефона и т.п. Название магазина,
//должно совпадать с фактическим названием магазина, которое публикуется на сайте. При несоблюдении
//данного требования наименование может быть изменено Яндексом самостоятельно без уведомления Клиента.
$cfg_name = $cfg->fromname;

//Полное наименование компании, владеющей магазином. Не публикуется, используется для внутренней идентификации.
$cfg_company = $cfg->sitename;

//URL-адрес главной страницы магазина без http://
$cfg_url = 'pobedit.com.ua';

// Шаблон для описания товара
// Вместо {product_name} - будет вставлено наименование товара
// Вместо {product_desc} - будет вставлено краткое описание
// ПРИМЕР:
// $description_template = '{product_name} от производителя';
$description_template = '{product_desc}';

// Ставка за клик (в центах)
$bid = '11';


$hostname = $cfg->host;
$username = $cfg->user;
$password = $cfg->password;
$dbName = $cfg->db;
$category = $cfg->dbprefix."vm_category";
$category_xref = $cfg->dbprefix."vm_category_xref";
$userstable = $cfg->dbprefix."vm_product";
$pricetable = $cfg->dbprefix."vm_product_price";
$product_category_xref = $cfg->dbprefix."vm_product_category_xref";

mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_select_db($dbName) or die(mysql_error());

// Исправьте, если у вас другая кодировка в БД
mysql_query('set names utf8');

echo"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
echo"<!DOCTYPE yml_catalog SYSTEM \"shops.dtd\">\n";
echo"<yml_catalog date=\"";
echo date('Y-m-d H:i');
echo"\">\n";
echo"<shop>\n";
echo"<name>$cfg_name</name>\n";
echo"<company>$cfg_company</company>\n";
echo"<url>$cfg_url</url>\n";

// курсы валют, приравнены к курсу ЦБРФ
echo"<currencies>\n";
echo"<currency  id=\"UAH\" rate=\"1\"/>\n";
echo"<currency  id=\"RUR\" rate=\"CBRF\"/>\n";
echo"<currency  id=\"USD\" rate=\"CBRF\"/>\n";
echo"<currency  id=\"EUR\" rate=\"CBRF\"/>\n";
echo"</currencies>\n";

// Секция категорий
echo"<categories>\n";
$query_cat = "SELECT * FROM $category_xref";
$res_cat = mysql_query($query_cat) or die(mysql_error());
$rw=1;
while ($row_cat=mysql_fetch_array($res_cat)) {
$cat_parent_id=$row_cat['category_parent_id'];
$cat_child_id=$row_cat['category_child_id'];
$query2 = "SELECT category_name FROM $category WHERE category_id=".$row_cat['category_child_id'];
$res_cat1 = mysql_query($query2) or die(mysql_error());
$name_cat=mysql_fetch_array($res_cat1);
$cat_name=$name_cat['category_name'];
if ($cat_parent_id==0) {
echo"<category id=\"".$cat_child_id."\">".$cat_name."</category>\n";
}
else {
echo"<category id=\"".$cat_child_id."\" parentId=\"".$cat_parent_id."\">".$cat_name."</category>\n";
}
$rw++;
}
echo"</categories>\n";

// Секция описания товаров
echo"<offers>\n";

$tb_product = $cfg->dbprefix."vm_product";
$tb_manufacturer = $cfg->dbprefix."vm_manufacturer";
$tb_product_mf_xref = $cfg->dbprefix."vm_product_mf_xref";
$tb_category = $cfg->dbprefix."vm_category";
$tb_product_category_xref = $cfg->dbprefix."vm_product_category_xref";
$tb_price = $cfg->dbprefix."vm_product_price";

$query = "
SELECT
$tb_product.product_id,
$tb_product.product_name,
$tb_manufacturer.mf_name,
$tb_manufacturer.manufacturer_id,
$tb_category.category_name,
$tb_category.category_id,
$tb_product_category_xref.category_id,
$tb_price.product_price,
$tb_product.product_sku,
$tb_product.product_in_stock,
$tb_product.product_unit,
$tb_product.product_full_image,
$tb_product.product_s_desc,
$tb_product.product_weight
FROM
($tb_product_category_xref
RIGHT JOIN ($tb_price
RIGHT JOIN (($tb_product_mf_xref
RIGHT JOIN $tb_product
ON $tb_product_mf_xref.product_id = $tb_product.product_id)
LEFT JOIN $tb_manufacturer
ON $tb_product_mf_xref.manufacturer_id = $tb_manufacturer.manufacturer_id)
ON $tb_price.product_id = $tb_product.product_id)
ON $tb_product_category_xref.product_id = $tb_product.product_id)
LEFT JOIN $tb_category
ON $tb_product_category_xref.category_id = $tb_category.category_id
WHERE $tb_product.product_publish='Y'
";

$row = d2a($query);
$product_log = Array();
for($i=0;$i<count($row);$i++) {
if (!in_array($row[$i]['product_id'],$product_log) AND ($row[$i]['product_price'])) {
$product_log[] = $row[$i]['product_id'];

$url="http://$cfg_url/index.php?page=shop.product_details&amp;flypage=shop.flypage&amp;option=com_virtuemart&amp;product_id=".$row[$i]['product_id'];
//$url="http://$cfg_url/client?page=shop.product_details&flypage=flypage-new.tpl&product_id=".$row[$i]['product_id']."&category_id=".$row[$i]['category_id']."&manufacturer_id=".$row[$i]['manufacturer_id'];

$product_full_image = "http://$cfg_url/components/com_virtuemart/shop_image/product/".$row[$i]['product_full_image'];
$tags = Array ('{product_name}','{product_desc}');
$repl = Array ($row[$i]['product_name'],$row[$i]['product_s_desc']);
$product_price = substr($row[$i]['product_price'], 0, -3);
$product_cat_id=$row[$i]['category_id'];
echo"\n<offer id=\"".$row[$i]['product_id']."\" available=\"true\" bid=\"$bid\">\n";
echo"<url>".$url."</url>\n";
echo"<price>$product_price</price>\n";
// Валюта в которой указаны Ваши цены
echo"<currencyId>UAH</currencyId>\n";
echo"<categoryId>".$product_cat_id."</categoryId>\n";
echo"<picture>".$product_full_image ."</picture>\n";
// Возможность доставки
echo"<delivery>true</delivery> \n";
echo"<name>".strip_tags($row[$i]['product_name'])."\"</name>\n";
echo"<description>".strip_tags(str_replace($tags,$repl,$description_template))."</description>\n";
echo"</offer>\n";
}
}

echo"</offers>\n";
echo"</shop>\n";
echo"</yml_catalog>\n";

function d2a($query){
    $result = mysql_query($query) or die("Query failed : " . mysql_error());
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {$res[] = $line;}
    mysql_free_result($result);
    return $res;
}

?>
2. Загрузите этот файл в корень вашего сайта. В моем случае он будет доступен по пути:
http://pobedit.com.ua/market.yml - если вы видите текст значит происходит экспорт товаров. Если вы просмотрите исходный код страницы вы увидите как все на самом деле красиво получается.

3. ВНИМАНИЕ. Для того чтобы файл работал, необходимо "сказать" серверу, что этот yml файл на самом деле php код, который надо выполнить. Для этого есть несколько способов:


- Найти в своей хостинг панели место, где можно сказать какие файлы интерпретировать как php. Но поскольку у каждого хостинг разный у вас может такого и не быть. Я использую Украина Хостинг.
- Добавить в .htaccess директиву обрабатывать PHP в YML файлах: 
# Чтобы в файлах .html и .htm работали включения PHP вида <?php:?>
RemoveHandler .html .htm
AddType application/x-httpd-php .php .html .phtml .htm .yml
- Любой другой способ на ваше усмотрение.

4. Проверяйте работу скрипта: открывайте страницу http://ваш_сайт/market.yml в браузере и смотрите исходный код страницы. Убеждаемся, что идёт выгрузка.
Проверяйте работу скрипта через интерфейс Яндекс-Маркета или Яндекс-Вебмастера (там тоже есть возможность подключить YML файл).

5. Импортируйте ваш прайс куда угодно:
Несмотря на то, что аудитория «Яндекс.Маркет» составляет львиную долю (порядка 70 %) от всей аудитории подобных сервисов, рекомендую Вам обратить внимание на другие рекламные площадки и не пренебрегать их потенциалом (и это только Россия):
  1. Torg.Mail.ru («Товары@Mail.ru») — универсальная площадка для размещения прайс-листов магазинов от разработчиков портала «Mail.ru». Используется свой формат для экспорта товаров. Отличия от YML незначительные;
  2. Price.ru — универсальная площадка для размещения прайс-листов магазинов от разработчиков портала «Rambler». Используется YML, CSV или Excel;
  3. MixMarket.biz — партнёрская сеть «МиксМаркет» для владельцев интернет-магазинов. Поддерживают файлы в формате YML, но производитель товара должен указываться в отдельном теге;
  4. Hi-Fi.ru — специализированный каталог аудио- и видеотехники. Принимают файлы в формате YML;
  5. Poisk-Podbor.ru — универсальная площадка для размещения прайс-листов магазинов. Принимают файлы в формате YML;
  6. ABC.ru — универсальный каталог, принимают файлы в формате YML;
  7. MOBIL.ru — специализированный каталог по сотовым телефонам, КПК и т. п. Принимают файлы в формате YML;
  8. STEREO.ru — специализированный каталог по телевизорам, видеотехнике и т. п. Принимают файлы в формате YML;
  9. MobiGuru.ru — специализированный каталог по сотовым телефонам, цифровым фотоаппаратам, КПК, ноутбукам и т. п. Принимают файлы в формате YML.
Жду критики, если таковая имеется.

6 комментариев:

  1. Добавил директиву в .htaccess
    Все сделал по инструкции
    Но не выходит
    Выскакивает ошибка:
    Parse error: syntax error, unexpected '=' in /home/h0006588/domains/sir-knife.ru/public_html/market.yml on line 32
    В чем может быть проблема?

    ОтветитьУдалить
  2. какая версия виртуамарта? заполнены ли у вас все поля в конфигурации магазина (а именно название, короткое название и тд?)

    ОтветитьУдалить
  3. А что делать, если в магазине используется в качестве ЧПУ файл router.php?

    ОтветитьУдалить
  4. Если ссылки формируются другим рутером - то скрипт будет делать ссылки не на те страницы в лучшем случае - в худшем он вообще будет выдавать страницы 404. В таком случае рекомендую экспериментировать.

    обратите внимание на код:

    $url="http://$cfg_url/index.php?page=shop.product_details&flypage=shop.flypage&option=com_virtuemart&product_id=".$row[$i]['product_id'];
    //$url="http://$cfg_url/client?page=shop.product_details&flypage=flypage-new.tpl&product_id=".$row[$i]['product_id']."&category_id=".$row[$i]['category_id']."&manufacturer_id=".$row[$i]['manufacturer_id'];

    ОтветитьУдалить
  5. Подскажите у меня выдает ошибку
    mysql_query('set names windows1251');
    echo"\n";
    ставил и
    mysql_query('set names utf8');

    echo"\n"
    не помогает .Есть какие то идей .

    ОтветитьУдалить
  6. Этот комментарий был удален автором.

    ОтветитьУдалить