Скрипт экспорта товаров в Яндекс маркет (yml)

  • 12 Ответов
  • 4498 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн gaalferov

  • ***
  • 75
  • [+]9 / [-]0
  • Пол: Мужской
  • Всё будет хорошо ;)
    • Просмотр профиля
    • Web-developer GAAlferov
Добрый день.
Сегодня вашему вниманию предлагаю скрипт для экспорта товаров в Яндекс маркет.
Первоначально необходимо выполнить настройки в файле .htaccess, а именно прописать, что бы yml файлы обрабатывались как php-ный
Ну и потом в самом Яндекс маркете указать путь на ваш yml файл.

Что скрипт умеет?
  • Файл формируется очень быстро, вывод результата при кол-ве товаров даже более 5000 занимает 3-10 сек.
  • Ничего не надо настраивать, все берется из конфигурационного файла Joomla, кроме itemid в url
  • Если в настройках Joomla включено формирование SEF ссылок, то на выходе получите также красивые урл
  • Скрипт полностью откомментирован, доработки и оптимизация приветствуется

И так по порядку, настройки в файле htaccess:
[spoiler]

Код: (xml) [Выделить]
AddHandler x-httpd-php5 .yml

<FilesMatch "\.(yml|php)$">
SetHandler application/x-httpd-php
</FilesMatch>

[/spoiler]

Ну и код самого скрипта:
[spoiler]
Код: (php) [Выделить]
/*
Edited by GAAlferov
Date - 2013.11.21
Site - http://gaalferov.com
*/
 
// ADD Joomla framework
if (!defined('_JEXEC')) {
/*** Joomla part ***/
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__) );
define( 'DS', DIRECTORY_SEPARATOR );
/* Required Files */
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
/* To use Joomla's Database Class */
require_once ( JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php' );
require_once ( JPATH_LIBRARIES.DS.'joomla'.DS.'import.php');
/* Create the Application */
$app = JFactory::getApplication('site')->initialise();
$site_setting = JFactory::getApplication();
/*** Joomla part ***/
}
 
//NAME - Короткое название магазина (название, которое выводится в списке найденных на Яндекс.Маркете товаров.
//Не должно содержать более 20 символов). Нельзя использовать слова, не имеющие отношения к
//наименованию магазина ("лучший", "дешевый"), указывать номер телефона и т.п. Название магазина,
//должно совпадать с фактическим названием магазина, которое публикуется на сайте. При несоблюдении
//данного требования наименование может быть изменено Яндексом самостоятельно без уведомления Клиента.
$cfg_name = transliterate($site_setting->getCfg('fromname'));   // исключаем запрещенные ЯМаркетом символы (см. function transliterate($name) в конце файла); далее это примечание опущено
 
//Полное наименование компании, владеющей магазином. Не публикуется, используется для внутренней идентификации.
$cfg_company = transliterate($site_setting->getCfg('sitename'));
 
//URL-адрес главной страницы магазина без http://
$cfg_url = $_SERVER['HTTP_HOST'];
 
// Шаблон для описания товара
// Вместо {product_name} - будет вставлено наименование товара
// Вместо {product_desc} - будет вставлено краткое описание
// ПРИМЕР:
// $description_template = '{product_name} от производителя';
 
$description_template = '{product_desc}';
 
$bid = '10';         // Ставка за клик (в центах)
 
$category = "#__vm_category";
$category_xref = "#__vm_category_xref";
$userstable = "#__vm_product";
$pricetable = "#__vm_product_price";
$product_category_xref = "#__vm_product_category_xref";
 
// Исправьте encoding, если у вас другая кодировка
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";
$db =& JFactory::getDBO();
$query_cat = "SELECT * FROM $category_xref";
$db->setQuery($query_cat);
$row_cats = $db->loadAssocList();
 
foreach ($row_cats as $row_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'];
$db->setQuery($query2);
$name_cat = $db->loadAssocList();
$cat_name=transliterate($name_cat[0]['category_name']);
if ($cat_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";
}
}
}
 
echo"</categories>\n";
 
// Секция описания товаров
echo"<offers>\n";
 
$tb_product = "#__vm_product";
$tb_manufacturer = "#__vm_manufacturer";
$tb_product_mf_xref = "#__vm_product_mf_xref";
$tb_category = "#__vm_category";
$tb_product_category_xref = "#__vm_product_category_xref";
$tb_price = "#__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' AND $tb_product.product_in_stock > '0'
";
 
$db->setQuery($query);
$rows = $db->loadAssocList();
 
$product_log = Array();
foreach ($rows as $row) {
if (!in_array($row['product_id'],$product_log) AND ($row['product_price'])) {
$product_log[] = $row['product_id'];
$product_cat_id=$row['category_id'];
/* В $url-е измените Itemid а также flypage на свой  */
$url= "http://$cfg_url".JRoute::_("index.php?page=shop.product_details&amp;flypage=flypage.tpl&amp;product_id=".$row['product_id']."&amp;category_id=".$product_cat_id."&amp;option=com_virtuemart&amp;Itemid=28");
$product_full_image = "http://$cfg_url/components/com_virtuemart/shop_image/product/".$row['product_full_image'];
$tags = Array ('{product_name}','{product_desc}');
$repl = Array ($row['product_name'],$row['product_s_desc']);
$product_price = substr($row['product_price'], 0, -3);
$manufacturer=transliterate($row['mf_name']);
$product_sku=transliterate($row['product_sku']);
$product_in_stock=$row['product_in_stock'];
if ($product_in_stock > 0) {
$available = "true";
$sales_notes = "";
} else {
$available = "false";
 
$sales_notes = ""; //$sales_notes = "Предоплата 50%"; - ПРИМЕР
}
echo"\n<offer id=\"".$row['product_id']."\" type=\"vendor.model\" available=\"$available\" bid=\"$bid\">\n";  // $available - наличие на складе
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"<pickup>true</pickup>\n"; // Возможность самовывоза
echo"<delivery>true</delivery>\n"; // Возможность доставки
echo"<local_delivery_cost>1000</local_delivery_cost>\n"; // Стоимость доставки
 
$prod_name=strip_tags($row['product_name']);
$prod_name_translit=transliterate($prod_name);
$des=strip_tags(str_replace($tags,$repl,$description_template));
$des_translit=transliterate($des);
 
echo"<typePrefix>".$prod_name_translit."</typePrefix>\n";   // Группа товаров/категория.
echo"<vendor>".$manufacturer."</vendor>\n";                       // Производитель - обязательный элемент
echo"<model>".$product_sku."</model>\n"; // Модель - обязательный элемент
 
echo"<description>".$des_translit."</description>\n";   // Описание товарного предложения
echo"<sales_notes>".$sales_notes."</sales_notes>\n";   // Необязательный элемент
echo"</offer>\n";
}
}
 
echo"</offers>\n";
echo"</shop>\n";
echo"</yml_catalog>\n";
 
function transliterate($name)
{
$tbl= array(
'"'=>'&quot;', '&'=>'&amp;', '>'=>'&gt;', '<'=>'&lt;', '\''=>'&apos;'
);
$str = strtr($name, $tbl);
$transliteration = preg_replace('[^-a-z0-9\.]', '', $str);
return $transliteration;
}
[/spoiler]

Пример результата работы можно посмотреть тут (около 800 товаров)

p.s. тестировалось на Joomla 1.5.26 + vm 1.1
1.12.2013 в 13:06
внесены изменения по url примеров (ссылка сейчас на тестовый домен, все согласовано)
убрана надпись с рекомендацией по названию и пути расположения
в ближайшее время изменю запрос и добавлю определение автоматом itemid

*

Оффлайн fsv

/* В $url-е измените Itemid а также flypage на свой  */
Itemid , соответствующий VM, можно получать автоматом. Но это мелочи.
Flypage в разных категориях может быть разный. Просто добавьте в запрос получение поля category_flypage из #_vm_category + его значение -> переменной + эту переменную в $url .

Пример результата работы можно посмотреть ...
Вы согласовали с хозяевами сайтов то, что слили в паблик источник парсинга их товаров?
Если "нет", удалите ссылки и сообщите им, чтобы изменили путь к файлу и его название.
И поэтому
Цитировать
Для этого вам потребуется скопировать сам файл в корень вашего сайта - market.yml
так лучше не делать. Свой путь, свое название файла.
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

Оффлайн gaalferov

  • ***
  • 75
  • [+]9 / [-]0
  • Пол: Мужской
  • Всё будет хорошо ;)
    • Просмотр профиля
    • Web-developer GAAlferov
Itemid , соответствующий VM, можно получать автоматом. Но это мелочи.
Flypage в разных категориях может быть разный. Просто добавьте в запрос получение поля category_flypage из #_vm_category + его значение -> переменной + эту переменную в $url .
Вы согласовали с хозяевами сайтов то, что слили в паблик источник парсинга их товаров?
Если "нет", удалите ссылки и сообщите им, чтобы изменили путь к файлу и его название.
И поэтомутак лучше не делать. Свой путь, свое название файла.
Учел ваши замечания.

*

Оффлайн fsv

Учел ваши замечания.
Это были пожелания.

Спасибо за доработку. Тему закрепляю.
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

Оффлайн h3moff

Спасибо автору за работу.
Обнаружился один недочет: цены в VirtueMart указаны в нескольких валютах: RUB, USD, EUR. А при выводе нет пересчета в рубли, хотя валюта RUB подставляется. Как это можно поправить?

*

Оффлайн gaalferov

  • ***
  • 75
  • [+]9 / [-]0
  • Пол: Мужской
  • Всё будет хорошо ;)
    • Просмотр профиля
    • Web-developer GAAlferov
Спасибо автору за работу.
Обнаружился один недочет: цены в VirtueMart указаны в нескольких валютах: RUB, USD, EUR. А при выводе нет пересчета в рубли, хотя валюта RUB подставляется. Как это можно поправить?
Добрый день, в ближайшее время доработать не смогу, просто нет времени. Но в будущем учту обязательно.

Здравствуйте не знаю сидит кто тут или нет но вопрос:
Мне этот скрипт нужен для Яндекса маркета
Как вы видите скрипт выволдит цены в рублях
echo"<currencyId>RUR</currencyId>\n";
То есть в цены он выводит в рублях. но у меня на сайте есть цены как и в рублях так и в $
скажите пожалуйста как сделать так что бы когда она обращался к сайту он выводил и РУБЛИ и $ то есть к примеру:
<url>http://anetwork.ru/index.php?page=shop.product_details&amp;option=com_virtuemart&amp;flypage=flypage.tpl&amp;product_id=2374</url>
<price>25217.00</price>
<currencyId>RUR</currencyId>
<categoryId>4</categoryId>
<picture>http://anetwork.ru/components/com_virtuemart/shop_image/product/df0f68524ee68087dabeebab15bf1098.jpg</picture>
<delivery>true</delivery>
<name>Funkwerk ELMEG CS 400 XT</name>
<vendor>Funkwerk</vendor>
а некоторые товары вот так:
<url>http://anetwork.ru/index.php?page=shop.product_details&amp;option=com_virtuemart&amp;flypage=flypage.tpl&amp;product_id=2374</url>
<price>25217.00</price>
<currencyId>USD</currencyId>
<categoryId>4</categoryId>
<picture>http://anetwork.ru/components/com_virtuemart/shop_image/product/df0f68524ee68087dabeebab15bf1098.jpg</picture>
<delivery>true</delivery>
<name>Funkwerk ELMEG CS 400 XT</name>
<vendor>Funkwerk</vendor>

*

Оффлайн h3moff

Здравствуйте не знаю сидит кто тут или нет но вопрос:
Мне этот скрипт нужен для Яндекса маркета
Как вы видите скрипт выволдит цены в рублях
echo"<currencyId>RUR</currencyId>\n";
То есть в цены он выводит в рублях. но у меня на сайте есть цены как и в рублях так и в $
скажите пожалуйста как сделать так что бы когда она обращался к сайту он выводил и РУБЛИ и $ то есть к примеру:
<url>http://anetwork.ru/index.php?page=shop.product_details&amp;option=com_virtuemart&amp;flypage=flypage.tpl&amp;product_id=2374</url>
<price>25217.00</price>
<currencyId>RUR</currencyId>
<categoryId>4</categoryId>
<picture>http://anetwork.ru/components/com_virtuemart/shop_image/product/df0f68524ee68087dabeebab15bf1098.jpg</picture>
<delivery>true</delivery>
<name>Funkwerk ELMEG CS 400 XT</name>
<vendor>Funkwerk</vendor>
а некоторые товары вот так:
<url>http://anetwork.ru/index.php?page=shop.product_details&amp;option=com_virtuemart&amp;flypage=flypage.tpl&amp;product_id=2374</url>
<price>25217.00</price>
<currencyId>USD</currencyId>
<categoryId>4</categoryId>
<picture>http://anetwork.ru/components/com_virtuemart/shop_image/product/df0f68524ee68087dabeebab15bf1098.jpg</picture>
<delivery>true</delivery>
<name>Funkwerk ELMEG CS 400 XT</name>
<vendor>Funkwerk</vendor>


Для какого ВМ?

h3moff,Всмысле ВМ?

*

Оффлайн h3moff

h3moff,Всмысле ВМ?
ВМ = VirtueMart


*

Оффлайн gaalferov

  • ***
  • 75
  • [+]9 / [-]0
  • Пол: Мужской
  • Всё будет хорошо ;)
    • Просмотр профиля
    • Web-developer GAAlferov
Попробуйте заменить вот эту часть

Код: (php-brief) [Выделить]
// Валюта в которой указаны Ваши цены
echo"<currencyId>RUR</currencyId>\n";

На
Код: (php-brief) [Выделить]
// Валюта в которой указаны Ваши цены
echo"<currencyId>$row['product_currency']</currencyId>\n";

*

Оффлайн DimaXP

Попробуйте заменить вот эту часть

Код: (php-brief) [Выделить]
// Валюта в которой указаны Ваши цены
echo"<currencyId>RUR</currencyId>\n";

На
Код: (php-brief) [Выделить]
// Валюта в которой указаны Ваши цены
echo"<currencyId>$row['product_currency']</currencyId>\n";




Может быть кому-нибудь пригодится, если после добавления echo"<currencyId>$row['product_currency']</currencyId>\n"; выдает ошибку.

меняем
[spoiler]
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
[/spoiler]

на

[spoiler]
SELECT *
[/spoiler]

после

$manufacturer=transliterate($row['mf_name']);

добавляем
   
$product_currency=$row['product_currency'];


меняем
echo"<currencyId>RUR</currencyId>\n";

на
echo"<currencyId>".$product_currency."</currencyId>\n";
« Последнее редактирование: 09.06.2016, 15:41:13 от DimaXP »