Отладка
Разработка под e-commerce
Яндекс API
25 марта 2014

Корректный YML для Яндекс.Маркета. Взгляд программиста


Многие интернет-магазины попадают в Яндекс.Маркет, не все там остаются надолго. Одно из условий присутствия в ЯМ-е – наличие корректного прайса в специальном формате YML.

Проверка такого прайса на ошибки и устранение таковых – целая история. Пока он не будет сформирован по всем правилам – вход в сие царство демпинга заказан. А при доведении документа до ума можно пережить немало незабываемых эмоций.

Данная статья – попытка обобщить те ошибки, с которыми сталкиваются программисты, впервые создающие инструменты (будь то автономный скрипт или плагин для CMS) для генерации YML-файла. Тем, кто с этим чудным форматом имел дело раньше, статья уже будет не столь интересна, ибо всё шишки набиты. Впрочем, вдруг и ветераны борьбы за своё место под солнцем Яндекса узнают что-то новое для себя. А то и поделятся собственным фронтовым опытом.

Классификация ошибок


  1. Неактуальные ошибки


    • Не та кодировка. Первое обо что спотыкались в старые добрые времена. Большинство движков работают на UTF-8, а ЯМ когда-то требовал только любимую кодировку Windows. Поговаривают, что капризного Яшу можно было объегорить – сделать вид, что согласны на богомерзкую cp1251 при утверждении магазина, после того как «таможня даёт добро» – преспокойно заменить прайс на расово верный Юникод. Что интересно – CSV (как нежелательную альтернативу YML) Яндекс.Маркет принимает исключительно в UTF-8 :)

    Все остальные грабли лежат всё там же.

  2. Ошибки спецификации XML



    YML – это частный случай XML. А значит, должен соответствовать его основным правилам. Не забываем об обязательном наличии <?xml ?> и <!DOCTYPE>, следим за правильной вложенностью тегов, заменяем «великолепную пятёрку» (", &, <, >, ') на их мнемонические эквиваленты.

    Причём, в самих мнемониках символ & на его мнемонику &amp; менять не нужно, а то какая-то бесконечная рекурсия может получиться. Прежде чем применять к тексту (для элемента <description>, например) функцию htmlspecialchars, следует учесть, что там уже могут мнемоники изначально присутствовать ;)

  3. Критичные ошибки YML


    Теперь Ваш прайс – кошерный XML, но Яндекс наотрез отказывается его принимать. Разбираемся дальше.

    • Ошибки в использовании элементов. Перечитываем 3 раза (а ещё лучше — 5) внимательно официальную документацию, не забываем про глобальные теги (<yml_catalog>, <shop>), следим за правильным написанием названий, не занимаемся отсебятиной в виде придумывания несуществующих в спецификации тегов, всю иерархию расставляем по yml-скому фен-шую, указываем правильно параметры и т.д.


    • Отсутствие обязательных элементов. Самые частые ошибки новичков и не очень новичков. Особенно часто такое всплывает при формировании offer-ов. Необязательный тег для одного вида описаний может оказаться обязательным для другого. К примеру, <vendor>. На такое можно напороться, если раньше к продукции применялось упрощённое описание, а потом вдруг решили переделать на vendor.model.

    • Не каноничный порядок элементов. Очень подлая ошибка, прям-таки удар под дых для тех, кто с ней сталкивается впервые. Ситуация, когда Яндекс невозмутимо настаивает, что в строке такой-то позиция такая-то что-то не так, а в указанном месте ничего подозрительного и в упор не видно (причём, гугление форумов и медитация на офдокументацию эффекта не даёт) – способна довести любого до белого каления.
      А ларчик просто открывается – элементы должны идти именно в том порядке, в котором они перечислены в спецификации. Вот в упрощённом описании сначала название товара, а потом производитель. А в vendor.model сначала производитель, а потом название товара. И ни в коем разе не наоборот.

    • Повторы продукции по ID. Что умиляет, ошибка эта Яндексом выдаётся сразу двумя разными способами (чтобы никто не запутался) – сначала перечисляются элементы с некорректными идентификаторами, а потом идёт список предложений-дубликатов.
      С перепугу можно решить, что ошибок в 2 раза больше, чем на самом деле. И если с дубликатами всё понятно, то непосвящённым ещё предстоит догадаться чем именно некорректны некорректные идентификаторы.

  4. Некритичные ошибки YML



    Яндекс почти ублажен. Поработаем ещё немного.

    • Некорректные URL. Часто это ссылки, например, содержащие пробельные символы или русские буквы. Вообще, во многих движках в таблицах БД обычно есть поля, хранящие прямые линки на страницы продукции. Что характерно, почти во всех CMS среди этих ссылок очень много мусора и поэтому обычно приходится генерировать самому.

    • Цена равна 0. Здесь программисту нужно посовещаться с контент-менеджером. Или фильтровать нулевые цены, но тогда о товарах, где забыли указать стоимость, вспомнят нескоро. Или не фильтровать и пускай в будущем контент-менеджер с претензиями Яндекса сам разбирается.

    • Неверные ссылки на картинки. Ну, тут примерно та же история, что и с неправильными URL. Прописанных в базе данных картинок часто не существует в природе. Прежде чем оформлять очередной <picture> – проверяйте наличие файла. Если картинка в наличии, но в названии есть злополучные пробелы – кодируйте ссылки в RFC3986 (функция rawurlencode Вам в помощь).


  5. Прочие ошибки


    ОК, все огрехи тотально устранены и скормленный Яндексу 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?
Размещение товаров на Яндекс.Маркете. Типичные проблемы и их решение
Ночное ворчание о Яндексе, Маркете и интерфейсах вообще

Опрос

+5
64,7k 108
Комментарии 18
Похожие публикации
Популярное за сутки