DLE-xml2tpl - Импорт новостей в формат YML средствами движка DLE

📅 {date}👁️ {views} просмотров📁 {category}

DLE-xml2tpl - Импорт новостей в формат YML средствами движка DLE

📅 29.04.2023👁️ 4046 просмотров📁 Наши разработки | Плагины для DLE
🏷️ Теги: XML, DLE14, DLE13, DLE15, плагин, модуль, верстка, платно

Выбрав в 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]