Нещодавно до нас звернувся магазин із 30 000 товарів: їх фід важив 20 MB, але при завантаженні Яндекс видавав помилку price missing для кожного другого товару. Виявилося, ціна зберігалася в окремій таблиці без індексу, і генератор просто не встигав підтягувати вартість. Після впровадження нашого рішення помилки зникли, а фід почав оновлюватися кожні 2 години без простоїв. Ми допомогли клієнту уникнути штрафів та зекономити час на ручному вивантаженні.
У цій статті ми розберемо типові проблеми, архітектуру генератора та етапи впровадження. Ви дізнаєтеся, як уникнути частих помилок і скоротити час на підтримку фіда. Ми підготували чек-ліст типових проблем, який допоможе при самостійному налаштуванні. Якщо ви зіткнулися з помилками фіда, зв'яжіться з нами — ми налаштуємо генератор за 2 дні.
Як уникнути типових помилок при експорті товарів у YML-фід?
Типові помилки: відсутність обов'язкових полів, неправильна вкладеність, перевищення довжини description. Наш генератор автоматично перевіряє кожне поле перед записом. Якщо ціна відсутня або дорівнює нулю, товар виключається з фіда, щоб не отримати штрафні бали. Ми також перевіряємо categoryId на існування батьківської категорії та відповідність кодам валют. Усі помилки логуються із зазначенням ID товару.
Проблеми, які вирішуємо — експорт товарів у
- Некоректні ціни та валюти — часто магазини вказують ціну без урахування ПДВ або забувають про
currencyId. Наш генератор автоматично підставляєRURі перевіряє, що ціна більша за нуль. - Занадто великий фід — каталог на 50 000 товарів важить 25 MB. Без gzip Яндекс може не прийняти. Ми додаємо стиснення на льоту.
- Часті оновлення — якщо ціни змінюються щогодини, фід має оновлюватися так само часто. Налаштовуємо cron з інтервалом від 1 години.
Як ми це робимо
Використовуємо PHP та Laravel. Для генерації — клас YmlFeedBuilder на основі XMLWriter. Це дозволяє формувати фід без завантаження всього DOM у пам'ять.
class YmlFeedBuilder { public function build(string $outputPath): void { $writer = new XMLWriter(); $writer->openUri($outputPath); $writer->startDocument('1.0', 'UTF-8'); $writer->writeDtd('yml_catalog', null, 'shops.dtd'); $writer->startElement('yml_catalog'); $writer->writeAttribute('date', now()->format('Y-m-d H:i')); $this->writeShopInfo($writer); $this->writeCurrencies($writer); $this->writeCategories($writer); $this->writeOffers($writer); $writer->endElement(); $writer->endDocument(); $writer->flush(); } private function writeOffers(XMLWriter $writer): void { $writer->startElement('offers'); Product::with(['category', 'attributes', 'images']) ->where('active', true) ->where('price', '>', 0) ->chunk(500, function ($products) use ($writer) { foreach ($products as $product) { $this->writeOffer($writer, $product); } }); $writer->endElement(); } } Використання chunk() обов'язкове — спроба завантажити 50 000+ товарів одним запитом призведе до OOM. Наш досвід з каталогами від 500 до 500 000 товарів гарантує стабільність генерації. Ми гарантуємо відповідність формату Яндекс.Маркету.Яндекс.Маркет
Чому фонова генерація YML-фіда критична для великих каталогів?
Для каталогів понад 10 000 товарів генерація на льоту не підходить — час відповіді перевищує ліміти. Використовуємо чергу або cron-задачу. Фід пишеться на диск або в S3, після чого стає доступним за прямим посиланням. Це дозволяє уникнути тайм-аутів і знизити навантаження на сервер.
Порівняння продуктивності
Генерація через XMLWriter у 2 рази швидша, ніж через SimpleXML, і споживає на 30% менше пам'яті. Це критично при обсязі від 50 000 товарів.
Типи оферів та їх особливості
| Тип | Застосування | Обов'язкові дод. поля |
|---|---|---|
vendor.model |
Електроніка, техніка | vendor, model |
book |
Книги | author, isbn |
| За замовчуванням | Усе інше | — |
Докладніше про типи оферів
Для `vendor.model` необхідно вказувати виробника та модель, для `book` — автора та ISBN. При неправильному типі Яндекс може відхилити товар. Наш генератор автоматично підбирає тип за категорією товару.Валідація фіда
Перед відправкою до Яндекс.Маркету фід потрібно перевіряти локально. Використовуйте офіційний валідатор Яндекс.Маркету. Наш генератор включає вбудовану перевірку:
class YmlFeedValidator { public function validate(string $filePath): array { $errors = []; $dom = new DOMDocument(); if (!$dom->load($filePath)) { return ['XML parse error']; } $offers = $dom->getElementsByTagName('offer'); foreach ($offers as $offer) { $id = $offer->getAttribute('id'); if (!$offer->getElementsByTagName('price')->length) { $errors[] = "Offer {$id}: missing price"; } if (!$offer->getElementsByTagName('url')->length) { $errors[] = "Offer {$id}: missing url"; } // Перевірка довжини description (Яндекс обрізає після 3000 символів) $desc = $offer->getElementsByTagName('description')->item(0); if ($desc && mb_strlen($desc->textContent) > 3000) { $errors[] = "Offer {$id}: description too long"; } } return $errors; } } Яндекс.Маркет рекомендує не перевищувати 500 MB на фід (згідно з офіційною документацією).
Розклад оновлення
- Ціни та залишки — оновлюються часто: рекомендується регенерація кожні 1–4 години.
- Атрибути та описи — повільно змінюються: достатньо 1 разу на добу.
- Нові товари — негайно або при наступному годинному циклі.
Приклад налаштування в Laravel:
$schedule->job(new GenerateYmlFeedJob)->everyFourHours(); Оптимізація розміру фіда
Яндекс.Маркет рекомендує не перевищувати 500 MB на фід. Якщо каталог більший — розбивайте за категоріями та реєструйте кілька фідів.
Зниження розміру без втрати якості:
- Виключати товари без ціни (
WHERE price > 0) - Виключати неактивні категорії
- Обрізати
descriptionдо 1000–1500 символів - Стискати фід gzip — Яндекс підтримує
Таблиця порівняння розмірів:
| Каталог | Без стиснення | З gzip |
|---|---|---|
| 10 000 товарів | 5 MB | 1.2 MB |
| 50 000 товарів | 25 MB | 6 MB |
| 100 000 товарів | 50 MB | 12 MB |
Як налаштувати генератор YML-фіда: покрокова інструкція
- Створіть клас
YmlFeedBuilderна основіXMLWriter, як показано вище. - Налаштуйте вибірку товарів з оптимізацією запитів (використовуйте
chunk()). - Додайте валідацію обов'язкових полів перед записом.
- Реалізуйте розклад оновлень через cron або чергу.
- Підключіть стиснення gzip та перевірте фід офіційним валідатором.
Строки реалізації
- Базовий генератор з типом за замовчуванням: 1–2 дні
- Додавання типізованих оферів (
vendor.model): +0.5 дня - Валідатор + логування помилок: +0.5 дня
- Налаштування cron + публічний URL: +0.5 дня
Разом типовий проєкт: 2–3 робочих дні. Вартість розраховується індивідуально — економія на підтримці та штрафах окупає вкладення.
Що входить у роботу
- Генератор YML-фіда, налаштований під ваш каталог
- Вбудований валідатор зі звітом про помилки
- Налаштування розкладу оновлення (cron або черга)
- Стиснення фіда gzip
- Документація щодо формату та підтримки
- Навчання співробітників роботі з фідом
Замовте налаштування YML-фіда та забудьте про помилки. Отримайте консультацію щодо вашого проєкту — зв'яжіться з нами.
Чек-ліст типових помилок
- [ ] Неактивні товари з ціною 0
- [ ] Відсутність url або price
- [ ] Description довше 3000 символів
- [ ] Неправильна категорія (parentId не існує)
- [ ] Фід більше 500 MB







