Экспорт в формат яндекс маркет из VirtueMart 1.1.5

virtuemart яндекс маркетЗадача: экспорт Virtuemart в яндекс маркет

Настроить выгрузку данных (шлюз) из Virtuemart 1.1.5 (Joomla 1.5.21) в яндекс маркет. Для этого надо выгрузить информацию о продукции в формат YML.

Решение для экспорта магазина virtuemart в яндекс маркет

Для этого делаем скрипт, который при вызове обращается к таблицам VirtueMart, хранящимся в Б/Д джумлы и выводит инфу в формате YML. К сожалению, формат YML не совсем соответствует спецификации XML, так что приходится создавать его «ручками» без использования XML библиотек. Итак:

Скрипт market.yml для экспорта магазина на Virtuemart в яндекс маркет

Создаём в корневой папке джумлы файл market.yml следующего содержания (сохраняем файл в кодировке utf-8):

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

// Пропишите относительный путь к '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 = 'test.ru';

// Шаблон для описания товара
// Вместо {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=\"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"\n";
	}
}

echo"</count></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

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

# Чтобы в файлах .html и .htm работали включения PHP вида
RemoveHandler .html .htm
AddType application/x-httpd-php .php .html .phtml .htm .yml

Проверка работы

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

Источник

ВСЕ ДЛЯ НОВИЧКА

Вот и все мы закончили экспортировать товар с магазина Virtuemart в яндекс маркет.

Popularity: 26% [?]


  • Autostatus24

    Скажите,почему после установки на сайте перестали покпзываться фото товара?

  • Cube

    Спасибо за скрипт. Но у меня яндекс выдает ошибку.
    Ошибка: Неизвестный тип файла: application/xml; charset=utf-8
    Фатальная ошибка: Внутренняя ошибка во время распаковки

    В чем может быть проблема?
    Возможно яндекс ожидает файл в кодировке 1251?

  • wrximpreza

    У Вас не открывается страница что вы показали, может быть дублирование товара. Также и другие ошибки. Если ссылка будет работать напишете я посмотрю

  • Дмитрий

    Вопрос! Как установить тип на все товары book???????

  • Admin

    Здравствуйте.
    Этот скрипт передает в Яндекс маркет наличие товара на складе?
    Я могу ограничить вывод определенных товаров в маркет?
    Спасибо заранее.