Loading...

Создание турбо страниц 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( [ '&', '<', '>', '"', '\'' ], [ '&amp;', '&gt;', '&lt;', '&quot;', '&apos;' ], 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)

* Можно вместо шаблона создавать ресурс и в ресурсе указать "пустой шаблон"




4436