
Создание турбо страниц RSS для Яндекса на MODX Revo
Основной материал взят отсюда, и немного скорректирован. Тут НЕ используются Tickets, JEVIX
Cоздание обычной RSS ленты, но по другому некоторые параметры вызова
Нам понадобится
- pdoResources
- Создать сниппет rssText
- Создать сниппет rssCDATA
1. Создания сниппета RSS-FEEDa для подготовки текста заголовка
Согласно документации описания элементов RSS 2.0 в использовании технологии «турбо-страниц», во всех элементах RSS-файла, кроме содержимого раздела , необходимо кодировать следующие символы: «&» (амперсанд) — «&», «<» (левая угловая скобка) — «<», «>» (правая угловая скобка) — «>», «»» (кавычки) — «"», «’» (апостроф) — «'». Предполагается, что ваш сервер отдает данные в кодировке «UTF-8».
На основание вышеизложенной информации создадим сниппет, который будет подготавливать содержимое для указанных элементов: «title», «description» и прочих.
Создавём сниппет с назовем «rssText»:
if(empty($cnt)) return '';
$output = str_replace( [ '&', '<', '>', '"', '\'' ], [ '&', '>', '<', '"', ''' ], html_entity_decode($cnt) );
return $output;
Пояснение: использование функции html_entity_decode внутри кода обусловлено предположением, что заголовок,
дескрипшен или же текст другого элемента могут содержать html-сущности,
поэтому сначала происходит процесс декодирования и лишь потом, кодируется с учетом требований документации «Яндекса».
2. Сниппет подготовки текста содержимого
Как нам говорит документация по подготовке «турбо-страниц» — содержимое [CDATA[ ... ]] в кодировании не нуждается. Но все же, кое-какую подготовку провести нужно: вырезать якоря и якорные ссылки, которые служат для внутренней навигации по странице.
Создадим еще один сниппет назвав его «rssCDATA» и вставим в него следующий код:
if(empty($cnt)) return '';
$output = preg_replace( '/<a\s.*class="pseudo".*>(.+)<\/a>/U', '$1', $cnt );
$output = preg_replace( '/<a\s.*><\/a>/', '', $output );
return $output;
Пояснение: ссылки на якоря страницы мы регламентируем наличием CSS-класса «pseudo»,
а в вашей же верстке скорее всего это определяется по-другому — выясните как и подставьте нужное регулярное выражение.
3. Создания шаблона для RSS-FEED
Приступим, для начала создадим шаблон, к примеру «RSS-FEED»
Добавим в него следующий код и подставим свои значения (в title, description, links):
<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" version="2.0">
<channel>
<title>[[++site_url]][[~[[+id]]]]</title>
<link>[[++site_url]]blog</link>
<description>[[*description]]</description>
<language>ru</language>
[[!pdoResources?
&tpl=`tpl_yandex_turbo_rss`
&limit=`20`
&depth=`1`
&parents=`6,9,10,15`
&includeContent=`1`
&tvPrefix=`tv.`
&includeTVs=`img_katalog`
]]
</channel>
</rss>
Где «&parents» ставим id тех ресурсов, которые будут попадать в нашу ленту.
4. Создания чанка для RSS-FEEDa
Шаблон создали, теперь создадим чанк «шаблон-одного элемента rss», назовём его «tpl_yandex_turbo_rss».
<item turbo="true">
<link>{$_modx->config.site_url ~ $id | url}</link>
<title>{'!rssText' | snippet : [ 'cnt' => ( $longtitle ?: $pagetitle ) ]}</title>
<pubDate>{$publishedon | date : 'D, d M Y G:i:s +0300'}</pubDate>
<turbo:content>
<![CDATA[
<header>
<figure>
<img src="[[++site_url]][[+tv.img_katalog]]">
</figure>
<h1>{($longtitle ?: $pagetitle)}</h1>
</header>
{'!rssCDATA' | snippet : [ 'cnt' => ( $id | resource : 'content' | replace : '"assets/' : ('"' ~ $_modx->config.site_url ~ 'assets/') ) ]}
]]>
</turbo:content>
</item>
В «title» выкидываем заголовок статьи, в «link» полный адрес ссылки на ресурс.
Поле «description» не обязательно, но если нужно вывести часть контента, то потребуются компонент, который удалит html-теги. Это как раз созданные ранее сниппеты
5. Создание ресурса для RSS-FEEDa
И так, шаблон и чанк есть, теперь привяжем все это к нужному ресурсу.
Создаём ресурс, даём ему имя RSS-FEED, заходим во вкладку «Настройки» и меняем тип содержимого на XML.
Вкладка "Документ":
- Заголовок - RSS-FEED
- Шаблон - RSS-FEED
- Псевдоним - rss-feed
- Не показывать в меню - Да
- Опубликован - Да
Вкладка "Настройки":
- Тип содержимого - XML
- Доступен для поиска - Нет
- Использовать HTML редактор - Нет
- Заморозить URI - Да
- URI - rss-feed.xml
После этого лента будет по адресу http://вашсайт.ru/rss-feed.xml
Важно! Компоновка элементов панели создания ресурсов может немного отличатся от вашей, т.к. ее вид зависит от установленных в системе ModX Revolution дополнений, например таких, как «SEO Pro».С чем столкнулся при работе:
- 1. В элементе item отсутствует атрибут turbo со значением true (4 ошибки). Еще какието ошибки не помню уже и писать неохото (на скринах видно)
- 2. Не подгружались изображения на сайте первоисточнике по другому происходит вызов (применяются Tickets)
* Можно вместо шаблона создавать ресурс и в ресурсе указать "пустой шаблон"