Google Merchant как создать файл импорта товаров в xml / txt

Здравствуйте. Подскажите как создать фид для гугла — файла с товарами в формате txt или xml. Для Яндекс маркета файл создается готовым компонентом, а вот товары для Гугла сложности.

«Основной фид – это источник данных, необходимых для показа объявлений. Информацию о товарах можно загружать в виде файлов с расширением .txt или .xml, импортировать из Google Таблиц или добавлять через Google Content API for Shopping»

<?xml version="1.0"?>
  <rss version="2.0" 
  xmlns:g="http://base.google.com/ns/1.0">

  <channel>
    <title>[[#1.pagetitle]]</title>
    <link>[[++site_url]]</link>
    <description>[[#1.description]]</description>  

    [[!msProducts?
      &depth=`10`
      &limit=`9999`
      &parents=`[[+id]]`
      &tpl=`GoogleMerchantItem`
      &includeTVs=`brand,availability`
    ]]
  </channel>
  </rss>
<item>
  <title>[[+pagetitle:htmlent]]</title>
  <link>[[~[[+id]]? &scheme=`full`]]</link>
  <description>[[+introtext:htmlent]]</description>
  <g:image_link>http://site.name[[+thumb]]</g:image_link>
  <g:price>[[+price:stripString=` `]]</g:price>
  [[-<g:condition>new</g:condition>-]]
  <g:id>[[+id]]</g:id>
  <g:availability>[[+availability]]</g:availability>
  <g:brand>[[+brand]]</g:brand>
  <g:condition>new</g:condition>
  [[-<g:google_product_category>Категория товара в гугл</g:google_product_category>-]]
</item>
Нашел этот способ в интернете, но вместо XML-страничке получается ошибка:
This page contains the following errors:
error on line 1 at column 2: StartTag: invalid element name
Below is a rendering of the page up to the first error.
АндрейЧ
23 октября 2019, 15:55
modx.pro
2
2 603
+1

Комментарии: 11

Антон Тарасов
23 октября 2019, 18:07
+1
Попробуйте вот так примерно:

<?php

$filename = MODX_BASE_PATH . 'gmerch.xml';
$limit='1000';
$offset='0';
$tpl = '@INLINE <item>
  <title>{$pagetitle}</title>
  <link>'.MODX_BASE_PATH.'/{$uri}</link>
  <description>{$introtext | striptags}</description>
  <g:image_link>'.MODX_BASE_PATH.'/{$image}</g:image_link>
  <g:price>{$price}</g:price>
  <g:id>{$article}</g:id>
  <g:brand>{$_pls["vendor.name"]}</g:brand>
  <g:condition>new</g:condition>
</item>';
....

$data = '<?xml version="1.0"?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>Название</title>
<link>'.MODX_BASE_PATH.'</link>
<description>Описание</description>'; 
$data .= $modx->runSnippet('msProducts', array(
       'parents' => 0, 'where' => '{"Data.favorite":1, "alias:!=":""}', 'limit' => $limit, 'offset' => $offset, 'tpl' => $tpl, 'includeThumbs'=> '600x600', 'includeContent' => 1, 'includeTVs' => 'img,image'
    ))
...

$data .= '</channel>
    </rss>';
$filename = MODX_BASE_PATH . 'gmerch.xml';
$fp = fopen($filename, 'a');
fwrite($fp, $data);
fclose($fp);
Ну и проверки не забудьте, на наличие файла, возможность записи и т.д.
И файл https://domain.ru/gmerch.xml скормите мерчанту, создайте фид и в нем укажите, мол, файл лежит на сервере, вот он.
    АндрейЧ
    28 октября 2019, 20:02
    0
    Спасибо за помощь. С твоим кодом такая же ошибка.
    This page contains the following errors:
    error on line 1 at column 2: StartTag: invalid element name
    Below is a rendering of the page up to the first error.
    <?php
    $filename = MODX_BASE_PATH . 'gmerch.xml';
    $limit='1000';
    $offset='0';
    $tpl = '@INLINE <item>
      <title>{$pagetitle}</title>
      <link>'.MODX_BASE_PATH.'/{$uri}</link>
      <description>{$introtext | striptags}</description>
      <g:image_link>'.MODX_BASE_PATH.'/{$image}</g:image_link>
      <g:price>{$price}</g:price>
      <g:id>{$article}</g:id>
      <g:brand>{$_pls["vendor.name"]}</g:brand>
      <g:condition>new</g:condition>
    </item>';
    
    $data = '<?xml version="1.0"?>
    <rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
    <channel>
    <title>Название</title>
    <link>'.MODX_BASE_PATH.'</link>
    <description>Описание</description>'; 
    $data .= $modx->runSnippet('msProducts', array(
           'parents' => 0, 'where' => '{"Data.favorite":1, "alias:!=":""}', 'limit' => $limit, 'offset' => $offset, 'tpl' => $tpl, 'includeThumbs'=> '600x600', 'includeContent' => 1, 'includeTVs' => 'img,image'
        ));
    
    $data = '</channel></rss>';
    
    $filename = MODX_BASE_PATH . 'gmerch.xml';
    $fp = fopen($filename, 'a');
    fwrite($fp, $data);
    fclose($fp);
      Антон Тарасов
      28 октября 2019, 20:05
      0
      Это кто ругается, браузер? У меня-то это код нормальный фид выдает и Google Merchant Center доволен, никаких нареканий. Может что-то неверно с типом страницы? Адрес можно?
        АндрейЧ
        29 октября 2019, 16:53
        0
        Спасибо. Если в вызове msProducts? &parents=`[[*id]]` тогда товары в фид не выводятся, а шапка фида повляется. Если `[[+id]] тогда ошибка и фида нет вообще.

        При этом 2 ошибки в журнале:
        Обнаружено пустое состояние IN с идентификатором ключа

        [2019-10-29 16:28:06] (ERROR @ /core/xpdo/om/xpdoquery.class.php: 764) Encountered empty IN condition with key id
        [2019-10-29 16:25:50] (ERROR in modProcessor::run @ ..../core/model/modx/modprocessor.class.php: 177) Flat file processor support, used for action mgr/resources/getlist with path

        PS Оба варианта создания фида, сниппетом или просто XML файлом — работают отлично на тестовом сайте фид создается.
        На рабочем сайте — нет. так работает =`[[*id]]`, а так нет: &parents=`[[+id]]` Проблема в этом кусочке кода:
        [[!msProducts?
              &depth=`10`
              &limit=`9999`
              &parents=`[[*id]]`
              &tpl=`GoogleMerchantItem`
              &includeTVs=`brand,availability`
            ]]
        именно из-за него на XML странице с ошибка:


        А вот такой код протестил для интереса — он нормально создает XML страницу с RSS.
        :
        <?xml version="1.0" encoding="UTF-8"?>
        <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
        	<channel>
        		<title>[[*pagetitle]] / [[++site_name]]</title>
        		<link>[[~[[*id]]?scheme=`full`]]</link>
        		<description>[[*description:cdata]]</description>
        		<language>en</language>
        		<copyright></copyright>
        		<ttl>120</ttl>
        		<atom:link href="[[~[[*id]]?scheme=`full`]]" rel="self" type="application/rss+xml" />
        		[[!pdoResources?
        			&tpl=`tpl.Tickets.rss.row`
        			&parents=`15`
        			&depth=`1`
        			&limit=`10`
        			&showHidden=`1`
        			&sortby=`createdon`
        			&where=`{"class_key":"Ticket"}`
        			&useWeblinkUrl=`1`
        			&scheme=`full`
        		]]
        	</channel>
        </rss>
          АндрейЧ
          29 октября 2019, 18:58
          0
          Ответьте на личку плз, исправили бы проблему за вознаграждение.
    Эдвард Ерохин
    29 октября 2019, 12:11
    0
    а зачем генерировать файл если modx умеет в ресурсы с нужным типом?
      АндрейЧ
      29 октября 2019, 17:05
      0
      Подобная проблема c выховом msProducts описана тут modx.pro/help/12685
      Там выяснили что переменная [[+id]] некорректно передавалась через промежуточный чанк.
        АндрейЧ
        29 октября 2019, 20:21
        0
        Проблема почти решена, снипет создает все таки файл, на хостинге он нормально открывается как текстовый файл — идеальный фид  гугла, но по его адресу он не скачивается — почему то сайт его в виде страницы открывает, с красной ошибкой как на скрине выше.
          АндрейЧ
          29 октября 2019, 20:23
          0
          И еще странно, скачиваю этот файл — Gmerh.xml на комп — кидаю в браузер file:///C:/Users/HP/Downloads/gmerch.xml — все также ошибка
          Dolce
          17 июня 2021, 12:07
          0
          А для страницы у вас выбран пустой шаблон?
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            11