Когда я в первый раз собирал выгрузку WooCommerce в Яндекс Маркет для клиента с каталогом на 3000 товаров, фид отклонили с первого захода по семи причинам разом: от пустых цен до битых ссылок на картинки. С тех пор я свёл процесс к чек-листу, который снимает 90% типовых отказов модерации ещё до отправки файла. Дальше разберу, как устроен YML-фид, какие плагины реально работают на боевых магазинах и что чаще всего ломает модерацию.
По теме статьи
Готовое решение
Ограничение применения промокода в корзине Tilda
Промокод в Tilda не действует на выбранную категорию (например, «Распродажа»). Готовый скрипт + инструкция по подключению.
от6 000 ₽
Интернет-магазин
Интернет-магазин под ключ
Интернет-магазин под ключ — на Tilda, WordPress + WooCommerce, Next.js Commerce или кастомный бэкенд. Подберу платформу под бюджет, ассортимент и
от80 000 ₽
Почему Яндекс Маркет отклоняет фид из WooCommerce
WooCommerce изначально не заточен под формат YML. Это формат Яндекса, а WordPress отдаёт товары через свою внутреннюю структуру постов, метаполей и таксономий, поэтому между ними всегда нужен слой преобразования: плагин или скрипт. Проблема в том, что дефолтные настройки таких плагинов подгоняют структуру под общий шаблон, а не под конкретные требования Маркета к вашей категории товаров.
На практике модерация режет фиды по трём группам причин. Первая, техническая: невалидный XML, неэкранированные символы в описании, дубли offer id. Вторая, содержательная: несоответствие категории справочнику Маркета, отсутствие обязательных параметров для категории, например размер одежды или объём для бытовой химии. Третья, коммерческая: нулевые или неадекватные цены, товары без наличия, отсутствие доставки. Каждая из них лечится по-своему, но сначала нужно понимать структуру самого файла.
Структура YML: что обязательно для карточки товара
YML - это XML-файл с двумя основными блоками: shop с общими данными магазина и offers со списком товаров. Для каждого предложения Маркет ждёт минимум:
- уникальный
idпредложения, который не меняется между выгрузками; - рабочую ссылку
urlна карточку товара без пробелов и с корректным экранированием амперсандов; - цену
priceбольше нуля и код валютыcurrencyId; - категорию
categoryId, сопоставленную с деревом категорий магазина внутри того же фида; - картинку
pictureразмером не меньше 300х300 пикселей, доступную по https без авторизации; - название
nameбез капслока и без ключевых слов через запятую ради SEO.
Для одежды, обуви, бытовой техники и ряда других категорий Маркет требует дополнительные параметры: param name="Размер", штрихкод barcode, артикул производителя vendorCode. Если категория попадает под обязательный GTIN, а штрихкода нет, фид либо отклонят полностью, либо карточки конкретной категории просто не попадут в выдачу.
Пример минимального предложения выглядит так:
<offer id="1024" available="true">
<url>https://example.ru/product/kruzhka-keramicheskaya/</url>
<price>590</price>
<currencyId>RUR</currencyId>
<categoryId>15</categoryId>
<picture>https://example.ru/wp-content/uploads/mug.jpg</picture>
<vendor>NoName</vendor>
<name>Кружка керамическая 350 мл</name>
<description><![CDATA[Керамическая кружка объёмом 350 мл, подходит для посудомоечной машины.]]></description>
</offer>
Обратите внимание на CDATA в описании: если внутри текста есть HTML-теги или спецсимволы, без CDATA парсер Маркета либо обрежет описание, либо вернёт ошибку валидации.
Плагины для генерации YML из WooCommerce
На боевых проектах я обычно выбираю между тремя вариантами: готовый плагин с узкой специализацией под Яндекс Маркет, универсальный экспортёр товаров с надстройкой под YML и собственный скрипт на PHP, который генерирует фид напрямую из базы через хуки WooCommerce.
| Вариант | Гибкость категорий и параметров | Что проверять перед покупкой |
|---|---|---|
| Специализированный плагин под Яндекс Маркет | Готовое сопоставление категорий, но ограниченный набор дополнительных параметров | Дату последнего обновления и совместимость с текущей версией WooCommerce |
| Универсальный экспортёр (WP All Export и подобные) | Полная свобода в маппинге полей, включая ACF и произвольные метаполя | Отдельная лицензия на YML-модуль, которую часто продают отдельно от базового плагина |
| Собственный скрипт на хуках WooCommerce | Любая логика, включая мультисклады и динамические скидки | Кто будет поддерживать код при обновлении WooCommerce |
Готовые плагины закрывают 80% задач для магазина с типовым каталогом: одежда, косметика, товары для дома. Как только в каталоге появляются вариативные товары со сложной матрицей размеров и цветов или остатки тянутся из внешней 1С, дефолтного маппинга плагина уже не хватает, и приходится либо дописывать фильтры через хуки, либо переходить на кастомный экспорт.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Категории и атрибуты: сопоставление со справочником Маркета
Самая частая причина повторных отклонений, с которой я сталкивался, это не техническая ошибка, а смысловая: категория WooCommerce из шапки сайта один в один переносится в categoryId, хотя у Маркета своё дерево категорий с собственными обязательными атрибутами. У вас может быть категория «Кроссовки», а у Маркета внутри неё уже сидят обязательные параметры «Размер» и «Материал верха», без которых карточка не пройдёт даже при корректном XML.
Порядок действий, который у меня закрывает эту проблему стабильно:
- Выгружаю список категорий вашего магазина и вручную сопоставляю каждую с ближайшей веткой в справочнике Маркета через личный кабинет партнёра.
- Для категорий с обязательными характеристиками добавляю соответствующие метаполя в карточки товаров WooCommerce, если их ещё нет.
- В настройках плагина или в скрипте прописываю маппинг метаполе в
param name, а не жёстко зашитые значения. - Прогоняю тестовый фид на 20-30 товарах из каждой проблемной категории перед полной выгрузкой каталога.
Отдельно слежу за атрибутом vendor. Для брендовых категорий Маркет требует указывать производителя, а для категорий с обязательным GTIN без штрихкода товар просто не покажут в поиске, даже если фид формально пройдёт модерацию.
Цены, остатки и доставка в фиде
Ошибки с ценами обычно вылезают из-за округления и валюты: если магазин ведёт цены в WooCommerce с копейками и скидочными правилами через купоны, а в фид попадает базовая цена без учёта активной акции, Маркет показывает одну цену, а на сайте покупатель видит другую. Это не блокирует модерацию, но резко бьёт по доверию и может привести к жалобам площадки на несоответствие цены.
С остатками важно синхронизировать поле available с реальным статусом товара в WooCommerce (instock, outofstock, onbackorder), а не просто убирать товар из фида при обнулении остатка. У Маркета есть отдельная логика деактивации карточек, и резкое исчезновение позиций из фида воспринимается хуже, чем корректный available="false".
Доставку можно передавать через блок delivery-options с указанием стоимости и сроков. Если в магазине подключён расчёт доставки СДЭК через плагин интеграции, логично не дублировать тарифы вручную, а забирать актуальную стоимость и срок из того же расчёта, что видит покупатель на сайте. Иначе фид и корзина начнут расходиться в цифрах после первого же изменения тарифов.
Автообновление фида и мониторинг ошибок
WP-Cron у WordPress срабатывает только при заходе посетителя на сайт, поэтому для каталога от пары сотен товаров и выше я всегда переключаю генерацию фида на настоящий cron через хостинг, который дёргает URL экспорта по расписанию раз в 1-4 часа в зависимости от того, как часто меняются цены и остатки.
Для интеграций посложнее, где фид собирается не только из WooCommerce, но и подмешивает данные из CRM или склада, использую n8n: воркфлоу забирает данные по расписанию, валидирует структуру XML перед отправкой и уведомляет в телеграм, если количество товаров в новом фиде упало больше чем на 10% по сравнению с предыдущим. Это почти всегда признак того, что часть категорий выгрузилась пустой из-за сбоя на стороне сайта.
Если каталог большой, а обновление данных завязано на несколько источников, такую связку разумнее сразу проектировать под конкретный магазин, а не подгонять типовой плагин под чужую логику. Такие интеграции вместе с настройкой мониторинга ошибок фида я обычно беру в разработку под конкретный проект.
Перед каждой отправкой обновлённого фида стоит гонять его через встроенный валидатор в кабинете Яндекс Маркета в тестовом режиме: он показывает не только фатальные ошибки XML, но и предупреждения по конкретным офферам, которые не блокируют публикацию, но снижают показы карточки в поиске.
Частые вопросы
Как часто нужно обновлять YML-фид для Яндекс Маркета?
Для магазина с активными продажами и переменными остатками обновляю фид каждые 1-4 часа через cron. Если цены и остатки меняются редко, достаточно двух-трёх обновлений в сутки, но полностью статичный фид Маркет со временем начинает индексировать хуже.
Можно ли выгружать в Маркет товары без штрихкода GTIN?
Зависит от категории. Для одежды, обуви, косметики и электроники GTIN чаще всего обязателен, и без него карточка либо не пройдёт модерацию, либо не появится в поиске. Для части непродовольственных категорий без строгого регулирования штрихкод можно не указывать, но это стоит проверять по конкретной категории в справочнике Маркета, а не по общему правилу.
Почему Маркет ругается на категорию, хотя она указана в фиде?
Обычно это значит, что categoryId в вашем фиде не сопоставлен с категорией из дерева Маркета, а просто скопирован из структуры WooCommerce. Нужно вручную привязать каждую категорию сайта к ближайшей ветке в личном кабинете партнёра и убедиться, что для неё заполнены все обязательные параметры.
Что делать, если фид не проходит валидацию из-за большого объёма товаров?
Разбейте выгрузку на несколько фидов по категориям или брендам, это снижает нагрузку на генерацию и упрощает поиск проблемного участка при ошибке. Также проверьте таймаут скрипта на хостинге: для каталогов от нескольких тысяч товаров генерация одного большого XML-файла может не укладываться в лимит выполнения PHP по умолчанию.