Вторник, 20 Март 2012 16:43

Экспорт товаров из Virtuemart в Яндекс-маркет

Оцените материал
(1 Голосовать)

Сегодня мы поговорим об автоматическом размещении товаров из Виртуемарта в Яндекс-маркете. Данная статья, правда, относится исключительно к Virtuemart 1.1.x, для Virtuemart 2 я напишу по мере необходимости. Итак, нам нужно сделать все так, чтобы в Яндекс-маркет попадала вся требуемая информация, да к тому же, чтобы это все обновлялось в автоматическом режиме.

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

Итак, приступим к реализации. Нам необходимо сделать автоматическое формирование файла *.yml, который и будет кушать наш любимый Яндекс-маркет. Для этого нам надо создать файлик с именем... ... ...ммм... ... ...давайте назовем его export.yml и положим в корень сайта. Вэтот файл вставляем следующий код (кстати, не забудьте убрать BOM, если вы используете кодировку utf-8, иначе в начале файла будут добавлены лишние 2-4 байта в  виде херни какой-то):

<?php

  //***********************************************************

  //

  // Версия коннектора к Yandex.Market от 20.03.2012 г.

  // Автор доработок скрипта Артем Сучков (artem @ dezigner.ru)

  //

  // Проверялось на Joomla! 1.5.25 + VirtueMart 1.1.9

  //

  //***********************************************************
// Путь к 'configuration.php' 

  include 'configuration.php';

  $cfg = new JConfig();
//Короткое название магазина (название, которое выводится в списке найденных на Яндекс.Маркете товаров.

  //Не должно содержать более 20 символов). Нельзя использовать слова, не имеющие отношения к

  //наименованию магазина ("лучший", "дешевый"), указывать номер телефона и т.п. Название 

  //должно совпадать с фактическим названием магазина, которое публикуется на сайте. При несоблюдении

  //данного требования наименование может быть изменено Яндексом самостоятельно без уведомления Клиента.

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

  $cfg_company = $cfg->sitename;
//Домен

  $cfg_url = 'joomla-show.ru';
// Описание товара

  // Вместо {product_name} - будет вставлено наименование товара

  // Вместо {product_desc} - будет вставлено краткое описание

  $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());
// Кодировка. Для CP1251 значения будут такими: mysql_query('set names windows1251');  и в следующей строке замените utf-8 на windows-1251

  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=\"RUR\" rate=\"1\"/>\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-ask.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>RUR</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"\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;

  }

  ?>

Затем добавляем в .htaccess директиву заставляющую обрабатывать PHP в YML файлах:

RemoveHandler .html .htm
AddType application/x-httpd-php .php .html .phtml .htm .yml

Если все сделали, то при загрузке страницы www.your_domain.ru/export.yml вы должны увидеть вывод информации. Вы сразу поймете, есть ли там ошибки.

Не забудьте обратить пристальное внимание строкам:

039 - Впишите туда свой домен

070 - Читайте внимательно комментарий про кодировку. Да, при смене кодировки не забудьте преобразовать кодировку самого файла.

В заключение, хочу заметить: скрипт полностью рабочий, доработан и проверен лично мной, внедрен в рабочий проект. Все работает без перебоев.

Прочитано 19605 раз
Твитнуть

Комментарии   

 
Владик
0 #27 Владик 25.03.2015 19:45
Нашел вот такую штуку для своего сайта на virtuemart. Отлично работает.
http://joomline.ru/rasshirenija/komponenty/yandexmarketxml.html
Один минус платное. За то есть доки и поддержка
Цитировать
 
 
Vlamivi
0 #26 Vlamivi 24.03.2015 11:52
Артем, можете сделать такую штуку на заказ для моего сайта?
Напишите пожалуйста на
Цитировать
 
 
Александр1
0 #25 Александр1 27.11.2013 20:15
а где взять скрипт для virtuemart 2.0
Цитировать
 
 
Александр1
0 #24 Александр1 27.11.2013 20:15
Где взять такой скрипт для Virtuemart 2.0
Цитировать
 
 
Валерий Викторович
0 #23 Валерий Викторович 09.10.2013 18:44
При проверке появляется надпись
error on line 283 at column 5: Extra content at the end of the document
Below is a rendering of the page up to the first error.
Цитировать
 
 
KorneL
0 #22 KorneL 04.04.2013 14:00
А на версию 2ХХ нету такого плагина?
Цитировать
 
 
Дмитрий не Грозный
+1 #21 Дмитрий не Грозный 01.04.2013 18:37
Я наверное не слишком догадливый! Вы не могли бы уже пожалуйста заполненный файл изобразить для примера
Цитировать
 
 
Петя
0 #20 Петя 01.04.2013 14:37
Привет
Цитировать
 
 
Илья777
0 #19 Илья777 24.03.2013 14:56
Подскажите пожалуйста подойдет ли данный способ формирования yml файла для раздела Товары и Цены в Яндекс Вебмастере ??? Тут подробно расписаны технические требования к YML файлу для данного раздела, отличаются ли они от Маркета?
Цитировать
 
 
N-Dimasss
0 #18 N-Dimasss 18.02.2013 10:45
Подскажите как бороться с выгрузкой около 20 000 наименовний товаров? Время выполнения скрипта большое и выдается ошибка.
Цитировать
 
 
Артем
0 #17 Артем 06.02.2013 13:30
Скрипт от 20-го марта 2012-го года. Проверялся на Джумле 1.5 + Виртуемарт 1.1.9. Может быть уже что-либо поменялось на маркете. либо невнимательно делаете.
Цитировать
 
 
syncmaster
0 #16 syncmaster 25.10.2012 18:11
Выдаваемый xml принимается модератом, но в выдаче не появляется. Ответ Яндекса:
«В Вашем yml-файле содержатся ссылки с дополнительными параметрами, которые не поддерживаются Яндексом. Это препятствует формированию сниппетов.
Например: http://сайт/index.php?page=shop.product_details&flypage=shop.flypage&option=com_virtuemart&product_id=45
В данном случае некорректными являются параметры page, flypage, option, product.
Их необходимо удалить.»
Цитировать
 
 
alex 11111111111
0 #15 alex 11111111111 16.09.2012 17:40
Подскажите у меня выдает ошибку
mysql_query('se t names windows1251');
echo"\n";
ставил и
mysql_query('se t names utf8');

echo"\n"
не помогает .Есть какие то идей .
Цитировать
 
 
Константин22
0 #14 Константин22 17.07.2012 11:05
Артем, можете сделать такую штуку на заказ для моего сайта?
Напишите пожалуйста на
Цитировать
 
 
AlexD
+1 #13 AlexD 17.06.2012 22:16
А как сделать, чтобы в выгрузку не включались товары которых нет в наличии.
Спасибо!
Цитировать
 

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

Защитный код
Обновить

joomla 1.7

Не получаются доработки?

Становитесь партнером студии Millor! Быстро и недорого эти ребята помогут решить практически любую проблему.

Хотите подзаработать?

Если да, то вам сюда! Партнерская программа студии MyWebSite. Получи 20% за каждого клиента! Работаем по всей России и СНГ!

Рекламное место свободно.