![](https://habrastorage.org/getpro/habr/post_images/f7d/5ee/6db/f7d5ee6db5e67391274e645643161581.png)
Многие интернет-магазины попадают в Яндекс.Маркет, не все там остаются надолго. Одно из условий присутствия в ЯМ-е – наличие корректного прайса в специальном формате YML.
Проверка такого прайса на ошибки и устранение таковых – целая история. Пока он не будет сформирован по всем правилам – вход в сие царство демпинга заказан. А при доведении документа до ума можно пережить немало незабываемых эмоций.
Данная статья – попытка обобщить те ошибки, с которыми сталкиваются программисты, впервые создающие инструменты (будь то автономный скрипт или плагин для CMS) для генерации YML-файла. Тем, кто с этим чудным форматом имел дело раньше, статья уже будет не столь интересна, ибо всё шишки набиты. Впрочем, вдруг и ветераны борьбы за своё место под солнцем Яндекса узнают что-то новое для себя. А то и поделятся собственным фронтовым опытом.
Классификация ошибок
Неактуальные ошибки
- Не та кодировка. Первое обо что спотыкались в старые добрые времена. Большинство движков работают на UTF-8, а ЯМ когда-то требовал только любимую кодировку Windows. Поговаривают, что капризного Яшу можно было объегорить – сделать вид, что согласны на богомерзкую cp1251 при утверждении магазина, после того как «таможня даёт добро» – преспокойно заменить прайс на расово верный Юникод. Что интересно – CSV (как нежелательную альтернативу YML) Яндекс.Маркет принимает исключительно в UTF-8 :)
Все остальные грабли лежат всё там же.
Ошибки спецификации XML
YML – это частный случай XML. А значит, должен соответствовать его основным правилам. Не забываем об обязательном наличии <?xml ?> и <!DOCTYPE>, следим за правильной вложенностью тегов, заменяем «великолепную пятёрку» (", &, <, >, ') на их мнемонические эквиваленты.
Причём, в самих мнемониках символ & на его мнемонику & менять не нужно, а то какая-то бесконечная рекурсия может получиться. Прежде чем применять к тексту (для элемента <description>, например) функцию htmlspecialchars, следует учесть, что там уже могут мнемоники изначально присутствовать ;)
Критичные ошибки YML
Теперь Ваш прайс – кошерный XML, но Яндекс наотрез отказывается его принимать. Разбираемся дальше.
- Ошибки в использовании элементов. Перечитываем 3 раза (а ещё лучше — 5) внимательно официальную документацию, не забываем про глобальные теги (<yml_catalog>, <shop>), следим за правильным написанием названий, не занимаемся отсебятиной в виде придумывания несуществующих в спецификации тегов, всю иерархию расставляем по yml-скому фен-шую, указываем правильно параметры и т.д.
Отсутствие обязательных элементов. Самые частые ошибки новичков и не очень новичков. Особенно часто такое всплывает при формировании offer-ов. Необязательный тег для одного вида описаний может оказаться обязательным для другого. К примеру, <vendor>. На такое можно напороться, если раньше к продукции применялось упрощённое описание, а потом вдруг решили переделать на vendor.model.
- Не каноничный порядок элементов. Очень подлая ошибка, прям-таки удар под дых для тех, кто с ней сталкивается впервые. Ситуация, когда Яндекс невозмутимо настаивает, что в строке такой-то позиция такая-то что-то не так, а в указанном месте ничего подозрительного и в упор не видно (причём, гугление форумов и медитация на офдокументацию эффекта не даёт) – способна довести любого до белого каления.
А ларчик просто открывается – элементы должны идти именно в том порядке, в котором они перечислены в спецификации. Вот в упрощённом описании сначала название товара, а потом производитель. А в vendor.model сначала производитель, а потом название товара. И ни в коем разе не наоборот.
- Повторы продукции по ID. Что умиляет, ошибка эта Яндексом выдаётся сразу двумя разными способами (чтобы никто не запутался) – сначала перечисляются элементы с некорректными идентификаторами, а потом идёт список предложений-дубликатов.
С перепугу можно решить, что ошибок в 2 раза больше, чем на самом деле. И если с дубликатами всё понятно, то непосвящённым ещё предстоит догадаться чем именно некорректны некорректные идентификаторы.
- Ошибки в использовании элементов. Перечитываем 3 раза (а ещё лучше — 5) внимательно официальную документацию, не забываем про глобальные теги (<yml_catalog>, <shop>), следим за правильным написанием названий, не занимаемся отсебятиной в виде придумывания несуществующих в спецификации тегов, всю иерархию расставляем по yml-скому фен-шую, указываем правильно параметры и т.д.
Некритичные ошибки YML
Яндекс почти ублажен. Поработаем ещё немного.
- Некорректные URL. Часто это ссылки, например, содержащие пробельные символы или русские буквы. Вообще, во многих движках в таблицах БД обычно есть поля, хранящие прямые линки на страницы продукции. Что характерно, почти во всех CMS среди этих ссылок очень много мусора и поэтому обычно приходится генерировать самому.
- Цена равна 0. Здесь программисту нужно посовещаться с контент-менеджером. Или фильтровать нулевые цены, но тогда о товарах, где забыли указать стоимость, вспомнят нескоро. Или не фильтровать и пускай в будущем контент-менеджер с претензиями Яндекса сам разбирается.
- Неверные ссылки на картинки. Ну, тут примерно та же история, что и с неправильными URL. Прописанных в базе данных картинок часто не существует в природе. Прежде чем оформлять очередной <picture> – проверяйте наличие файла. Если картинка в наличии, но в названии есть злополучные пробелы – кодируйте ссылки в RFC3986 (функция rawurlencode Вам в помощь).
- Некорректные URL. Часто это ссылки, например, содержащие пробельные символы или русские буквы. Вообще, во многих движках в таблицах БД обычно есть поля, хранящие прямые линки на страницы продукции. Что характерно, почти во всех CMS среди этих ссылок очень много мусора и поэтому обычно приходится генерировать самому.
Прочие ошибки
ОК, все огрехи тотально устранены и скормленный Яндексу yml-прайс не выплёвывается обратно. Погодите расслабляться, через пару дней вполне может прийти «письмо счастья» от менеджеров ЯМ-а, в котором уведомляется, что:
- Товарный ряд сплагиачен из другого магазина. Особо тяжкое преступление, караемое по всей строгости закона.
- В вашем прайсе мы упорно искали и таки нашли дубликаты!
- И кстати, некоторые ссылки ведут не туда.
- Какой идиот создавал эту категоризацию?
- В качестве фото продукции используются заглушки.
- Одни и те же фото у разных товаров. Ну и что с того, что на официальном сайте производителя то же самое?
- А некоторые картинки вообще не с Вашего сайта.
- В мутных водах элементов <description> плавает «рыба».
- В магазине 100% предоплата, но почему об этом ни гу-гу в теле необязательного элемента <sales_notes>?
- Ах, у Вас из 500 товаров есть всего один «под заказ»? А почему у него aviable=’true’, а не ‘false’?
- У вас, уважаемые, доставка 3 дня, а по нашим понятиям товар считается «доступным» если доставляется в течении 2-х.
- … и всякое-такое прочее.
А посему Ваша лавочка пока отстранена от присутствия в торговой вселенной Яндекс.Маркета на срок от недели до навсегда.
По большому счёту, подобные ошибки вне компетенции кодеров. За них отвечают другие специально обученные люди – контент-менеджеры, SEO-шники, маркетологи или кого там ещё нагрузили следить за содержимым сайта. Впрочем, программисты иногда могут помочь и здесь. Например, фильтруя картинки-заглушки (определяя их по стандартным названиям) или не пропуская описания продукции, почему-то начинающиеся со слов «Lorem ipsum» и «bla bla bla».
Как и где проверять ошибки
Отлавливать все эти многочисленные ляпы проще всего в таком порядке.
- Ошибки XML. Хозяюшке на заметку – дублируйте yml-файлы с расширением xml, по крайней мере в период тестирования (да и потом может пригодиться). В браузерах и текстовых редакторах yml-документы открываются как унылые текстовики, что делает их неудобными для просмотра и анализа. В дебрях XML ориентироваться намного проще: там всегда весёленькая подсветка тегов + элементы можно «схлопнуть» в соответствии с их иерархической структурой + браузер услужливо подскажет где несоответствия спецификации. В общем, отследить ошибки YML проще, открыв его как XML.
- Проверка в Яндекс-Маркете. Ну, и последнее слово – за Яндексом. Зарегистрировав магазин, проверяйте файл в ихнем валидаторе и устраняйте выдаваемые ошибки до победного конца.
Ссылки
Яндекс:
Официальная спецификация YML
Требования к методу передачи данных
Валидатор
Вопросы и ответы
Требования к рекламным материалам
Хабрахабр:
Яндекс.Маркет – to be or not?
Размещение товаров на Яндекс.Маркете. Типичные проблемы и их решение
Ночное ворчание о Яндексе, Маркете и интерфейсах вообще
Опрос
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Приходилось ли вам с нуля писать скрипты/плагины для генерации YML?
34.27% Да, особых затруднений никогда не было49
23.78% Да, когда настраивал первый раз – проклял всё на свете34
41.96% Нет, не приходилось60
Проголосовали 143 пользователя. Воздержались 30 пользователей.