Реалізація імпорту товарів з Google Merchant Feed

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація імпорту товарів з Google Merchant Feed
Середня
~3-5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація імпорту товарів з Google Merchant Feed

Google Merchant Feed (GMF) — XML-формат на основі Atom/RSS з полями з простору імен g:, який виробники та дистрибютори готують для Google Shopping. Для інтернет-магазину імпорт з цього формату відкриває доступ до добре структурованих даних з обов'язковими полями id, title, description, price та availability.

Структура Google Merchant Feed

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
  <channel>
    <title>Фід товарів постачальника</title>
    <item>
      <g:id>SKU-12345</g:id>
      <g:title>Бездротові навушники Example Pro</g:title>
      <g:description>Навушники з шумозануренням, 30 год роботи</g:description>
      <g:price>4990 RUB</g:price>
      <g:sale_price>3990 RUB</g:sale_price>
      <g:availability>in stock</g:availability>
      <g:brand>Example</g:brand>
      <g:gtin>0012345678901</g:gtin>
      <g:color>Чорний</g:color>
    </item>
  </channel>
</rss>

Парсер з підтримкою namespace

Ключова особливість GMF — всі поля товару в просторі імен g:. SimpleXML потребує явної роботи з namespace:

class GoogleMerchantFeedParser
{
    private const G_NS = 'http://base.google.com/ns/1.0';

    public function parse(string $filePath): iterable
    {
        $reader = new \XMLReader();
        $reader->open($filePath);

        while ($reader->read()) {
            if ($reader->nodeType === \XMLReader::ELEMENT && $reader->name === 'item') {
                $node = new \SimpleXMLElement($reader->readOuterXml());
                $g = $node->children(self::G_NS);
                yield $this->parseItem($g);
            }
        }
        $reader->close();
    }

    private function parseItem(\SimpleXMLElement $g): array
    {
        [$price, $currency] = $this->parsePrice((string) $g->price);

        return [
            'sku'         => (string) $g->id,
            'name'        => (string) $g->title,
            'description' => (string) $g->description,
            'price'       => $price,
            'currency'    => $currency,
            'availability'=> $this->parseAvailability((string) $g->availability),
            'brand'       => (string) $g->brand,
            'gtin'        => (string) $g->gtin,
            'color'       => (string) $g->color,
            'images'      => array_filter([(string) $g->image_link]),
        ];
    }

    private function parsePrice(string $raw): array
    {
        // "4990 RUB" → [4990.0, 'RUB']
        if (preg_match('/^([\d.,]+)\s+([A-Z]{3})$/', trim($raw), $m)) {
            return [(float) str_replace(',', '.', $m[1]), $m[2]];
        }
        return [(float) $raw, 'RUB'];
    }

    private function parseAvailability(string $raw): string
    {
        return match (strtolower(trim($raw))) {
            'in stock'      => 'in_stock',
            'out of stock'  => 'out_of_stock',
            'preorder'      => 'preorder',
            default         => 'unknown',
        };
    }
}

GTIN-дедублікація

GTIN (EAN-13, UPC, ISBN) — глобальний ідентифікатор для точного матчингу товарів:

$product = Product::where('gtin', $offer['gtin'])
    ->orWhere('sku', $offer['sku'])
    ->first();

Пріоритет: GTIN > SKU > MPN.

Стиснені фіди (.gz)

Google рекомендує стискати великі фіди. Автодетект:

private function openFeed(string $url): string
{
    if (str_ends_with(parse_url($url, PHP_URL_PATH), '.gz')) {
        $gz = gzopen($url, 'rb');
        $fp = fopen($tmpFile, 'wb');
        while (!gzeof($gz)) fwrite($fp, gzread($gz, 8192));
        gzclose($gz);
        fclose($fp);
    } else {
        copy($url, $tmpFile);
    }
    return $tmpFile;
}

Тривалість реалізації

  • Парсер з namespace, базові поля, доступність, ціна з валютою — 1–2 дні
  • Варіативні товари через item_group_id, маппінг Google-категорій — +1–2 дні
  • GTIN-дедублікація, стиснені фіди, завантаження зображень — +1 день