DLE-xml2tpl - Импорт новостей в формат YML средствами движка DLE
Выбрав в 2006 году DLE в качестве платформы для разработки сайтов все еще не пожалел. В том числе из-за шикарного шаблонизатора, благодаря которому с минимальными знаниями основ программирования любой начинающий вебмастер может адаптировать под себя внешний вид своего проекта.
Если кратко - главная фича шаблонизатора DLE в том, что его синтаксис основан на правилах русского языка, а не как принято в php и всех прочих языках программирования на основе построения английских слов. И благодаря этой особенности составлять правила вывода блоков внутри шаблона значительно проще. Но это тема для отдельной статьи, возможно когда-нибудь потом она будет написана.
В данной статье будут описаны принципы создания шаблона в формате XML для дальнейшей самостоятельной модификации.
Стандартный RSS поток DLE формируется на основе шаблона /tempates/rss.tpl и содержит в себе отдельные секции вывода информации в зависимости от настроек шаблона:
- Обычный RSS поток
- В формате Яндекс-Турбо
- В формате Яндекс Новости
Все три этих варианта объеденены единой оберткой описанной в файле /engine/rss.php
И именно в этом проблема, почему нельзя получить правильный YML формат для товарного фида Яндекс Маркета.
Тоже самое для автоматического импорта новостей для avito.
Но все как оказалось решается штатными средствами движка - мы просто создаем новый шаблон для определенной категории сайта и именно его адрес в качестве ссылки на YML отдаем Яндексу.
Готовые шаблоны доступны в репозитории https://github.com/tcse/DLE-xml2tpl
Шаблон импорта в формате YML https://github.com/tcse/DLE-xml2tpl/tree/main/tempates/xml2yml
Шаблон импорта в формате XML для Avito https://github.com/tcse/DLE-xml2tpl/tree/main/templates/xml2avitoru
Что такое YML формат и зачем он нужен сайту
Формат YML
https://yandex.ru/support/partnermarket/export/yml.html#yml-format
Стандарт YML (Yandex Market Language)разработан Яндексом и основан на стандарте XML.Формат YML предоставляет больше возможностей и преимуществ, чем форматы XLS, CSV.
типовой пример в формате .yml https://yandex.ru/support/partnermarket/export/yml.html#yml_example
Нам данный формат интересен для создания Яндекс Турбо страниц интернет-магазинов.
Заходим в свой кабинет на Яндекс Вебмастере https://webmaster.yandex.ru/ и ищем раздел "Турбо-страницы для интернет-магазинов"
Общая инструкция по подключению от яндекса тут https://yandex.ru/dev/turbo-shop/doc/quick-start/markets.html
Главное, без чего не будет произведен импорт - это цена товара.
Если ваш сайт на DLE используется в том числе для создания витрину товаров, то отдельное дополнительное поле с ценой у вас скорее всего уже есть.
После подключения турбо-страниц для магазинов у вас получиться что-то типа
И так, примеры шаблонов скачены и установлены на сайт.
Остается добавить (при необходимости) нужные дополнительные поля.
Для этого переходим Настройки скрипта -> Дополнительные поля новостей
Добавить в разделе дополнительных полей новостей следующие поля:
Либо открыть по ftp файл /engine/data/xfields.txt и дописать в самый конец
xml2tpl_io-yml|Включить вывод в формат YML||yesorno||0|0|0|0|||0|0|||||0|Если выключено - Данная новость не попадает в товарный фид||||||||
xml2tpl_io-avito|Включить вывод в формат Avito.ru||yesorno||0|0|0|0|||0|0|||||0|Если выключено - Данная новость не попадает в товарный фид||||||||
xml2tpl_price|Цена для xml2tpl||text||1|0|0|1|||0|0||||||Используется для импорта в форматы YML и Avito||||||||
xml2tpl_currencyid|Валюта, в которой указана цена товара для xml2tpl||select|RUR__NEWL__USD__NEWL__EUR__NEWL__BYN__NEWL__KZT__NEWL__UAH|0|0|0|0|||0|0||||||Цена и валюта должны соответствовать друг другу. Например, вместе с USD надо указывать цену в долларах, а не в рублях.||||||||
xml2tpl_vendor|Название производителя для xml2tpl||text||1|0|0|1|||0|0||||||||||||||
xml2tpl_vendorcode|Код товара, который ему присвоил производитель для xml2tpl||text||1|0|0|1|||0|0||||||||||||||
После чего при редактировании новостей появятся новые поля для корректного заполнения товарного фида.
Следующим шагом вам потребуется создать новую категорию сайта и в ее настройках выбрать в секции Установить другой шаблон для категории: шаблон с именем xml2yml для товарного фида YML
или шаблон с именем xml2avitoru для импорта объявлений на Avito
Так же рекомендуется установить в настройках категории запрет на поиск по сайту и отключить генерацию яндекс турбо страниц.
Далее получаем ссылки на категории сайтов внутри которых у нас формируются новости.
Для демонстрации работы я сделал 2 таких категории
https://tcse-cms.com/archive/xml2yml/ для формата YML
https://tcse-cms.com/archive/xml2avitoru/ для Avito
Переходим в Яндекс Вебмастер и добавляем ссылку на источник
тестируем правильность фида
там же можно посмотреть предварительную версию
Примерно так же все происходит и с форматом импорта на Avito.ru
Сам фид можно протестировать на соответствие по ссылке https://autoload.avito.ru/format/xmlcheck/
Стоит обратить внимание, что у каждого сайта свой набор полей, их можно и нужно прописывать в шаблоны самостоятельно.
Я лишь показал, что штатными средствами движка DLE можно генерировать XML файлы которые будут корректно обработаны при импорте на внешние сайты.
Скачать исходники шаблонов можно в репозитории https://github.com/tcse/DLE-xml2tpl
[attachment=92:xml2tpl.zip для DLE 13-15.3]
[attachment=99:xml2tpl-dle16.zip для DLE 16.0]
МЫ принимаем заказы на верстку XML шаблонов для DLE сайтов с вашими наборами дополнительных полей под Avito, avto.ru, drom.ru и Яндекс Маркет.
Пояснения по шаблонам для самых маленьких
Формат YML
Файл шаблона https://github.com/tcse/DLE-xml2tpl/blob/main/templates/xml2yml/main.tpl
Строка
{catmenu id="90" subcat="yes" template="categories" cache="no"}Формирует список категорий товаров на основе стандартного меню DLE сайта.
Где значение id="90" означает, что у вас первая категория магазина в базе сайта имеет номер 90
Список своих категории смотрите в админке /admin.php?mod=categories
параметр subcat="yes" говорт, что будет генерирована в виде пунктов меню все подпункты.
Таким образом в шаблон YML у нас формируется следующая структура:
Запчасти для тягачей и полуприцепов
Запчасти Kraker
Запчасти для полуприцепов WIELTON
Запчасти Cargo Floor
Компоненты гидравлических систем
Профили пола
Пластиковые компоненты и опоры
Электрические компоненты
Аксессуары и крепежные материалы
Запчасти Binotto
Гидравлические цилиндры
КОМ / Вал КОМ
Гидравлические баки
Гидравлические насосы
Гидростанции
Прочее
Запчасти MAN
Аксессуары
И далее, при формирования товарного предложения, которое задается все в том же шаблоне путем подключения custom шаблона
{custom category="90" template="custom" available="global" limit="500" order="reads" sort="desc" cache="no"}
Где значение category="90" аналогично тем, что были указаны для генерации меню категории выше.
Файл шаблона https://github.com/tcse/DLE-xml2tpl/blob/main/templates/xml2yml/custom.tpl
В нем описывается каждое отдельное товарное предложение.
Раз родительская категория товаров у нас имеет номер 90, то для каждого товара мы указываем именно ее.
90 К сожалению на данный момент (DLE 15.2) в скрипте отсутствует такое полезный тег как {category-news-id} который бы выводил номер категории у публикации.
По этой причине приходится собирать костыль в виде
[catlist=90]90 [/catlist]
[catlist=94]94 [/catlist]
[catlist=91]91 [/catlist]
[catlist=95]95 [/catlist]
[catlist=97]97 [/catlist]
[catlist=98]98 [/catlist]
[catlist=99]99 [/catlist]
[catlist=100]100 [/catlist]
[catlist=101]101 [/catlist]
[catlist=92]92 [/catlist]
[catlist=107]107 [/catlist]
[catlist=108]108 [/catlist]
[catlist=109] 109 [/catlist]
[catlist=110]110 [/catlist]
[catlist=111]111 [/catlist]
[catlist=112]112 [/catlist]
[catlist=93]93 [/catlist]
[catlist=96]96 [/catlist]
Описывая правильные номера категорий для товаров.
Отдельно хочу обратить внимание:
Передавая данные о своем контенте в Яндекс вы льете воду на чужую мельницу.
Пока ваш проект на этапе роста, вам важен любой трафик. НО если вы уже большие и авторитетные, то любые варианты турбо страниц или amp версий только сильнее огораживают интернет в рамках технокомпаний без возможности выхода наружу.
Вот наглядный пример из товаров сгенерированных на основе данного шаблона:
Когда в результате поиска Яндекса открывается турбо-версия магазина, Яндекс Браузер автоматически маскирует имя домена
При этом, если нажать на строку ввода адреса, то мы видим реальный адрес домена
Ну и конечно, далеко идущая идея с тем, что ссылки на оригинальный сайт в турбо-страницах есть только в одном единственном месте. И то, эта строка скрыта под скромной надписью "Официальный сайт".
На всякий случай напомню, что в Яндекс турбо страницах для константных сайтов, ссылка на оригинал материала была в каждой отдельной заметке.
И что дальше?
И вот тут мы переходим к самому интересному :)
У вас есть новости-товары автоматически публикуемые на Яндекс Маркет и Авито. Каталог мы не особо стремитесь пополнять (он и так не маленький, условно более 100 позиций) менять цены руками каждый раз это вовсе не интересно и муторно.
Самое время использовать нашу разработку DLE-importNews
Скачиваем с сайта нужные новости, открываем их в экселе и редактируем параметры цены и доступности для YML или XML файлов.
{banner_preorder-tg}
Дополнительная информация на 31.03.2023
Яндекс Вебмастер при добавлении товарного фида реализованного через шаблонизатор DLE стал выдавать ошибку формата.
Некорректное значение Content-Type. Разрешенные значения Content-Type: application/xml, text/xml, application/octet-stream.
Решение проблемы реализовал следующим образом.
На сайт добавляем маленький php файл, который будет брать ссылку на наш YML шаблон и преобразовывать его в XML файл, который мы размещаем в удобном месте. После чего ссылку на этот файл скармливаем Яндекс вебмастеру.
https://github.com/tcse/DLE-xml2tpl/blob/main/ymlsync.php
Сам файл помещаем в корне сайта. Например с именем ymlsync.php
Следовательно клик по ссылке https://sitename.ru/ymlsync.php запустит скрипт, который возьмет данные из шаблона сайта /archive/xml2yml и сохранит их под именем yml.xml в папке /uploads/
Далее ссылка на XML будет доступна по адресу https://sitename.ru/uploads/yml.xml
Где https://sitename.ru надо заменить на имя вашего домена
Если ваши цены обновляются часто - то для обновления их значений в xml файле будет достаточно настроить его автоматическое выполнение через cron на стороне хостинга.
Примерно вот по такой ссылке
/usr/bin/wget -O - -q "https://sitename.ru/ymlsync.php"Архив плагина для DLE 16 можно скачать тут [attachment=99:xml2tpl-dle16.zip]