Сам искал бесплатный вариант, но не нашел. По-этому, пришлось собрать всю информацию и "слепить" самому. Именно "слепить", мои знания php и mysqli очень поверхностны, профессионалы, наверняка, заметят это по коду, но факт остается фактом, скрипт успешно работает и проходит проверку. Пример работающего скрипта здесь. Выкладываю скрипт из идеологических соображений - код должен быть открытым и бесплатным Всегда! Код (PHP): <?php include 'configuration.php'; $cfg = new JConfig(); $cfg_name = $cfg->sitename; $cfg_company = $cfg->fromname; $cfg_url = 'Ваш_сайт.ru'; //Адрес Вашего сайта без http:// $hostname = $cfg->host; $username = $cfg->user; $password = $cfg->password; $dbName = $cfg->db; $ct = $cfg->dbprefix."jshopping_categories"; $pt = $cfg->dbprefix."jshopping_products"; $pc = $cfg->dbprefix."jshopping_products_to_categories"; echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; //кодировка самого .xml файла echo "<!DOCTYPE yml_catalog SYSTEM \"shops.dtd\">\n"; echo "<yml_catalog date=\"".date("Y-m-d H:i")."\">\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\t<currency id=\"RUR\" rate=\"1\"/>\n</currencies>\n"; $mysqli = new mysqli($hostname, $username, $password, $dbName); if (mysqli_connect_errno()) { printf("Подключение к серверу MySQL невозможно. Код ошибки: %s\n", mysqli_connect_error()); exit; } mysqli_query($mysqli, "SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); //кодировка подключения к БД mysqli_query($mysqli, "SET CHARACTER SET 'utf8'"); echo "<categories>\n"; if ($res = $mysqli->query("SELECT `name_ru-RU` AS cat_name, category_id FROM $ct WHERE category_publish = 1 ORDER BY category_id")) while( $row = $res->fetch_assoc() ) { printf("\t<category id=\"".$row['category_id']."\">".$row['cat_name']."</category>\n"); } echo "</categories>\n"; echo "<offers>\n"; if ($res = $mysqli->query(" SELECT $pt.product_id, $pt.product_url, $pt.product_ean, $pt.`product_quantity` AS quantity, $pt.product_price, $pt.`name_ru-RU` AS name, $pt.image, $pt.`short_description_ru-RU` AS description, $ct.`alias_ru-RU` AS cat_url, $ct.category_id FROM $pt LEFT JOIN $pc ON $pt.product_id = $pc.product_id LEFT JOIN $ct ON $pc.`category_id` = $ct.category_id WHERE product_publish = 1 ORDER BY product_id")) while( $row = $res->fetch_assoc() ) { if($row['quantity']>0) { $available = 'true'; } else { $available = 'false'; } echo "\t<offer id=\"".$row['product_id']."\" available=\"".$available."\" bid=\"10\">\n"; //bid = цена в центах за переход, 10 = 3 руб. echo "\t\t<url>http://".$cfg_url.'/'.$row['cat_url'].'/'.$row['product_url']."</url>\n"; echo "\t\t<price>".$row['product_price']."</price>\n"; echo "\t\t<currencyId>RUR</currencyId>\n"; // выборка не реализована, у меня только рубли echo "\t\t<categoryId>".$row['category_id']."</categoryId>\n"; if(!empty($row['image'])) { echo "\t\t<picture>http://$cfg_url/components/com_jshopping/files/img_products/".$row['image']."</picture>\n"; } echo "\t\t<store>true</store> \n"; echo "\t\t<delivery>true</delivery> \n"; //Возможность доставки echo "\t\t<local_delivery_cost>500</local_delivery_cost> \n"; //Стоимость доставки в рублях в домашнем регионе echo "\t\t<name>".strip_tags($row['name'])."</name>\n"; echo "\t\t<vendor>ПРОИЗВОДИТЕЛЬ</vendor> \n"; //Выборка не реализована, параметр не обязательный, можно удалить строку echo "\t\t<vendorCode>".$row['product_ean']."</vendorCode>\n"; echo "\t\t<description>".strip_tags($row['description'])."</description>\n"; echo "\t\t<country_of_origin>СТРАНА</country_of_origin> \n"; //Выборка не реализована, параметр не обязательный, можно удалить строку echo "\t</offer>\n"; } echo "</offers>\n"; $res->close(); $mysqli->close(); echo "</shop>\n"; echo "</yml_catalog>"; ?> Меняем параметры "под себя", создаем файл .php (напр. market.php) в корне сайта с указанным кодом. Если нужно вывод как .yml файл, создаем перенаправление в файле .htaccess После RewriteEngine On Добавляем #yandex url's RewriteRule ^market.yml? market.php [QSA,L] P.S. Будете править скрипт, будьте внимательны. Достаточно попутать "косые одиночные кавычки" ` с "прямыми" ', и все скрипт не работает. Удачи.
Здравствуйте. Спасибо за богоугодное дело )) Установил скрипт, поменял только название сайта. При загрузке Яша ругается: Дата из файла: 2015-08-09 09:09 (строка 3, столбец 37) Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Input is not proper UTF-8, indicate encoding ! (строка 34, столбец 11) Bytes: 0xCF 0xD0 0xCE 0xC8 (азборный "Стэнли"</name> <vendor> ) Нужно еще что-то менять в скрипте?
В принципе, в ответе уже все написано... Строка 34 устанавливает кодировку подключения к базе данных, скорее всего, у Вас кодировка БД другая. если моя догадка верна, надо менять кодировку во все скрипте с UTF-8 на Вашу. Дайте ссылку на файл .xml
http://turnik-grizzly.ru/yandex.php --- добавлено: 09.08.2015, первое сообщение размещено: 09.08.2015 --- Проверил кодировку. По умолчанию идет UTF-8. Я настройки не менял.
Перейдите по ссылке, правой кнопкой мыши => просмотреть код страницы. <vendor> и <country_of_origin> не в UTF-8. смотрите кодировку в этих таблиц БД с помощью php myadmin. --- добавлено: 09.08.2015 --- Скрипт здесь не причем.
Вот что нашел в php myadmin. xpnkh_jshopping_vendors InnoDB utf8_general_ci xpnkh_jshopping_countries InnoDB utf8_general_ci --- добавлено: 09.08.2015, первое сообщение размещено: 09.08.2015 --- Если в исходном коде страницы поменять кодировку на Кириллицу (Windows-1251), то эти поля становятся читаемыми. Возникает вопрос, что нужно менять. Кодировку этих двух элементов или скрипт? Ну и как это менять, конечно? --- добавлено: 09.08.2015 --- Выкинул 2 эти параметра из скрипта и все стало красивее, но на много дальше я не продвинулся. Теперь Яша ругается кучей ошибок типа: Дата из файла: 2015-08-09 22:26 (строка 3, столбец 37) Ошибка: URL предложения не соответствует стандарту RFC-1738: http://turnik-grizzly.ru/турник-брусья-пресс-3-в-1/ (строка 36, столбец 10) Ругается на кириллицу?
ДА. Вот описание ошибок https://yandex.ru/support/partnermarket/export/errors.xml Прочитайте требования к .yml в помощи Яндекса без понимания - что зачем и как Вам будет трудно. В данном случая я могу помочь Вам, если скрипт не работает, но он Работает, у Вас на сайте есть проблема адаптации к стандартам Яндекс. Партнер.
Чем дальше, тем интереснее. Решил попробовать отправить прайс без кириллических урлов. Отключил все, а скрипт все-равно выдает кириллицу. Он берет урлы пунктов "алиас" и "псевдоним"? Нельзя заставить его брать чупакабру вида http://turnik-grizzly.ru/index.php?...ory_id=24&product_id=459&Itemid=512......Хотя я не уверен, что и такой урл пройдет проверку, но пытаться ведь нужно. --- добавлено: 10.08.2015, первое сообщение размещено: 10.08.2015 --- Кстати, нормально, что скрипт в поле url пишет адрес категории, а не адрес товара? <offer id="428" available="true" bid="10"> <url>http://turnik-grizzly.ru/турник-брусья-пресс-3-в-1/</url> <price>2700.000000</price> <currencyId>RUR</currencyId> <categoryId>26</categoryId> <picture>http://turnik-grizzly.ru/components/com_jshopping/files/img_products/____________01-2.jpg</picture> <store>true</store> <delivery>true</delivery> <local_delivery_cost>500</local_delivery_cost> <name>Турник настенный 3 в 1 разборный "Стэнли"</name> <vendorCode>1</vendorCode> <description>Основные преимущества:Мягкие подлокотники и спинка,Навесная конструкция позволяет быстро менять положение турника,Мягкие ручки - в комплекте,Тренажер 3 в 1: пресс + турник + брусья.</description> </offer>
Еще раз: проблема не скрипте! А в Вашей БД. Скрипт только выводит то, что записано в таблицах! Прочитайте https://yandex.ru/support/partnermarket/offers.xml Начните все с начала. "Экспериментировать" без понимания задачи можно до бесконечности!
Как раз сейчас читаю: "url-URL страницы товара. Максимальная длина URL — 512 символов. Необязательный элемент для магазинов-салонов." Сказать, что "проблема в моей БД" - это тоже самое , что сказать "проблема в Джумле" "или проблема в Шопе". Потому что не я пишу название категории в название товара.
Блин, Вы сами написали, что одна таблица в одной кодировки, другая в другой. Это не проблема? Далее, цену товара выводит с 4-мя 0 - это не проблема?
Проблем куча. Получается, что скрипт работает, но не с джумлой или не с шопом, потому что у них база кривая.
Пришлось скрипт исправить. 1. исправлены url страниц товаров, они теперь генерируются из category_id и product_id 2. выкинуты необязательные поля, обязательные приведены в соответствие с спецификацией 3. адрес сайта берётся из переменных окружения, при переносе на другой сайт не требуется никаких правок Работает с joomshopping-4.16.1 и joomla-3.7.2 Код (CODE): <?php include 'configuration.php'; $cfg = new JConfig(); $cfg_name = $cfg->sitename; $cfg_company = $cfg->fromname; $cfg_url = $_SERVER['HTTP_HOST'].dirname($_SERVER['REQUEST_URI']); $hostname = $cfg->host; $username = $cfg->user; $password = $cfg->password; $dbName = $cfg->db; $ct = $cfg->dbprefix."jshopping_categories"; $pt = $cfg->dbprefix."jshopping_products"; $pc = $cfg->dbprefix."jshopping_products_to_categories"; echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; //кодировка самого .xml файла echo "<!DOCTYPE yml_catalog SYSTEM \"shops.dtd\">\n"; echo "<yml_catalog date=\"".date("Y-m-d H:i")."\">\n"; echo "<shop>\n"; echo "<name>$cfg_name</name>\n"; echo "<company>$cfg_company</company>\n"; echo "<url>http://".$cfg_url."</url>\n"; echo "<currencies>\n\t<currency id=\"RUR\" rate=\"1\"/>\n</currencies>\n"; $mysqli = new mysqli($hostname, $username, $password, $dbName); if (mysqli_connect_errno()) { printf("Подключение к серверу MySQL невозможно. Код ошибки: %s\n", mysqli_connect_error()); exit; } mysqli_query($mysqli, "SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); //кодировка подключения к БД mysqli_query($mysqli, "SET CHARACTER SET 'utf8'"); echo "<categories>\n"; if ($res = $mysqli->query("SELECT `name_ru-RU` AS cat_name, category_id FROM $ct WHERE category_publish = 1 ORDER BY category_id")) while( $row = $res->fetch_assoc() ) { printf("\t<category id=\"".$row['category_id']."\">".$row['cat_name']."</category>\n"); } echo "</categories>\n"; echo "<delivery-options>\n\t<option cost=\"500\" days=\"32\"/>\n</delivery-options>\n"; echo "<offers>\n"; if ($res = $mysqli->query(" SELECT $pt.product_id, $pt.product_url, $pt.product_ean, $pt.`product_quantity` AS quantity, $pt.product_price, $pt.`name_ru-RU` AS name, $pt.image, $pt.`short_description_ru-RU` AS description, $ct.`alias_ru-RU` AS cat_url, $ct.category_id FROM $pt LEFT JOIN $pc ON $pt.product_id = $pc.product_id LEFT JOIN $ct ON $pc.`category_id` = $ct.category_id WHERE product_publish = 1 ORDER BY product_id")) while( $row = $res->fetch_assoc() ) { if($row['quantity']>0) { $available = 'true'; } else { $available = 'false'; } echo "\t<offer id=\"".$row['product_id']."\" available=\"".$available."\" bid=\"10\">\n"; //bid = цена в центах за переход, 10 = 3 руб. echo "\t\t<url>http://".$cfg_url."/index.php?option=com_jshopping&controller=product&task=view&category_id=".$row['category_id']."&product_id=".$row['product_id']."</url>\n"; echo "\t\t<price>".$row['product_price']."</price>\n"; echo "\t\t<currencyId>RUR</currencyId>\n"; // выборка не реализована, у меня только рубли echo "\t\t<categoryId>".$row['category_id']."</categoryId>\n"; if(!empty($row['image'])) { echo "\t\t<picture>http://$cfg_url/components/com_jshopping/files/img_products/".$row['image']."</picture>\n"; } echo "\t\t<pickup>true</pickup> \n"; echo "\t\t<delivery>true</delivery> \n"; //Возможность доставки echo "\t\t<name>".strip_tags($row['name'])."</name>\n"; echo "\t\t<description>".strip_tags($row['description'])."</description>\n"; echo "\t</offer>\n"; } echo "</offers>\n"; $res->close(); $mysqli->close(); echo "</shop>\n"; echo "</yml_catalog>"; ?>
Чтобы ЧПУ не портить, можно поменять на: Код (PHP): if ($res = $mysqli->query(" SELECT $pt.product_id, $pt.`alias_ru-RU`, $pt.product_ean, $pt.`product_quantity` AS quantity, $pt.product_price, $pt.`name_ru-RU` AS name, $pt.image, $pt.`short_description_ru-RU` AS description, $ct.`alias_ru-RU` AS cat_url, $ct.category_id FROM $pt LEFT JOIN $pc ON $pt.product_id = $pc.product_id LEFT JOIN $ct ON $pc.`category_id` = $ct.category_id WHERE product_publish = 1 ORDER BY product_id")) А сам URL на: Код (PHP): echo "\t\t<url>http://".$cfg_url.'/katalog/'.$row['cat_url'].'/'.$row['alias_ru-RU']."</url>\n";