Яндекс Маркет — один из ключевых каналов продаж для российских интернет-магазинов. Для передачи товарного каталога используется YML (Yandex Market Language) — XML-формат с чётко определённой структурой. Правильно настроенный фид = корректное отображение товаров, нет ошибок фида = нет трафика с Маркета. Разберём детально.
Структура YML-файла
YML-файл — это XML с конкретной схемой. Базовая структура:
<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog date="2026-09-01 12:00">
<shop>
<name>Название магазина</name>
<company>Название компании</company>
<url>https://example.com</url>
<currencies>
<currency id="RUR" rate="1"/>
</currencies>
<categories>
<category id="1">Электроника</category>
<category id="2" parentId="1">Смартфоны</category>
</categories>
<offers>
<!-- Товары здесь -->
</offers>
</shop>
</yml_catalog>Элемент offer: обязательные поля
<offer id="12345" available="true">
<!-- ОБЯЗАТЕЛЬНЫЕ поля -->
<url>https://example.com/product/iphone-16-pro</url>
<price>89990</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<name>Смартфон Apple iPhone 16 Pro 256GB Черный</name>
<!-- РЕКОМЕНДУЕМЫЕ поля -->
<picture>https://example.com/images/iphone-16-pro.jpg</picture>
<vendor>Apple</vendor>
<model>iPhone 16 Pro</model>
<description>Флагманский смартфон Apple с чипом A18 Pro...</description>
<sales_notes>Официальная гарантия 1 год</sales_notes>
<barcode>0194253411857</barcode>
</offer>Типы офферов
Простой оффер (vendor.model)
Для стандартных товаров с производителем и моделью. Яндекс Маркет объединяет такие предложения с другими магазинами в карточку товара.
Произвольный оффер (type="vendor.model" не указан)
Для уникальных товаров без конкурентов (ручная работа, б/у, услуги). Создаётся отдельная карточка.
Книги, аудио, видео
Специальные типы с дополнительными обязательными полями (ISBN, автор, жанр).
Дополнительные характеристики (param)
<offer id="12345" available="true">
<!-- ... основные поля ... -->
<param name="Цвет">Черный</param>
<param name="Объем памяти" unit="ГБ">256</param>
<param name="Оперативная память" unit="ГБ">8</param>
<param name="Диагональ экрана" unit="дюйм">6.3</param>
</offer>Характеристики критичны для попадания в фильтры Маркета. Больше характеристик = больше показов в отфильтрованных выдачах.
Генерация YML в PHP (Laravel)
<?php
// routes/web.php
Route::get('/yml-feed', [YmlFeedController::class, 'index'])
->name('yml.feed');
// app/Http/Controllers/YmlFeedController.php
class YmlFeedController extends Controller
{
public function index(): Response
{
$categories = Category::where('is_active', true)
->orderBy('parent_id')
->get();
$products = Product::where('is_active', true)
->where('quantity', '>', 0)
->with(['category', 'images', 'attributes'])
->get();
return response()
->view('feeds.yml', compact('categories', 'products'))
->header('Content-Type', 'application/xml; charset=utf-8');
}
}{{-- resources/views/feeds/yml.blade.php --}}
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<yml_catalog date="{{ now()->format('Y-m-d H:i') }}">
<shop>
<name>{{ config('app.name') }}</name>
<company>{{ config('shop.company_name') }}</company>
<url>{{ config('app.url') }}</url>
<currencies>
<currency id="RUR" rate="1"/>
</currencies>
<categories>
@foreach($categories as $cat)
<category id="{{ $cat->id }}"@if($cat->parent_id) parentId="{{ $cat->parent_id }}"@endif>
{{ htmlspecialchars($cat->name) }}
</category>
@endforeach
</categories>
<offers>
@foreach($products as $product)
<offer id="{{ $product->id }}" available="{{ $product->quantity > 0 ? 'true' : 'false' }}">
<url>{{ route('products.show', $product->slug) }}</url>
<price>{{ $product->price }}</price>
<oldprice>{{ $product->old_price }}</oldprice>
<currencyId>RUR</currencyId>
<categoryId>{{ $product->category_id }}</categoryId>
@foreach($product->images as $image)
<picture>{{ $image->url }}</picture>
@endforeach
<name>{{ htmlspecialchars($product->name) }}</name>
<vendor>{{ htmlspecialchars($product->brand) }}</vendor>
<description><![CDATA[{{ $product->description }}]]></description>
@foreach($product->attributes as $attr)
<param name="{{ htmlspecialchars($attr->name) }}">
{{ htmlspecialchars($attr->value) }}
</param>
@endforeach
</offer>
@endforeach
</offers>
</shop>
</yml_catalog>Кэширование и обновление фида
YML-фид для 10 000 товаров генерируется несколько секунд. Его не нужно генерировать при каждом запросе Яндекса. Правильная стратегия:
// Генерируем фид раз в час и кэшируем
public function index(): Response
{
$xml = Cache::remember('yml_feed', 3600, function () {
$categories = Category::where('is_active', true)->get();
$products = Product::where('is_active', true)->with([...])->get();
return view('feeds.yml', compact('categories', 'products'))->render();
});
return response($xml)->header('Content-Type', 'application/xml; charset=utf-8');
}
// Инвалидация при изменении товаров
// В ProductObserver:
public function saved(Product $product): void
{
Cache::forget('yml_feed');
}Типичные ошибки в фиде
| Ошибка | Причина | Решение |
|---|---|---|
| Недопустимые символы в XML | Кавычки, амперсанды в описаниях | htmlspecialchars() или CDATA |
| Цена 0 или отрицательная | Некорректные данные в БД | Фильтровать where('price', '>', 0) |
| Битые ссылки на изображения | Удалённые файлы | Проверять существование файла |
| Дублирующиеся ID | Коллизии ID из разных источников | Использовать уникальные ID |
| Кодировка не UTF-8 | Неверная конфигурация | mb_convert_encoding или declare |
FAQ
Как часто Яндекс Маркет скачивает фид?
По умолчанию — раз в сутки. В настройках магазина можно изменить на каждые 6-12 часов. Принудительное обновление — кнопка «Обновить прайс» в личном кабинете.
Максимальный размер YML-фида?
Технических ограничений нет, но Яндекс рекомендует не более 600 000 офферов в одном файле. При большем количестве — делите на несколько фидов.
Нужно ли указывать товары с нулевым остатком?
available="false" — это сохраняет историю отзывов. Или удалить — меньше размер фида. Яндекс принимает оба варианта.Как передать скидки и акции?
<price> (актуальная цена) и <oldprice> (зачёркнутая). Яндекс Маркет автоматически покажет скидку в процентах.Можно ли передавать товары с вариантами (размеры, цвета)?
id, или через параметры <param>. Яндекс умеет группировать офферы в одну карточку по name+vendor+model.Настроим выгрузку в Яндекс Маркет
Разработаем YML-фид с правильной структурой, характеристиками и кэшированием. Подключим к Маркету и устраним ошибки валидации.
Нужна помощь с e-commerce?
Обсудим задачу, предложим решение и рассчитаем стоимость — бесплатно, без обязательств.