Реалізація імпорту товарів з 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 день







