Создаем RSS Feed в Modx с pdotools и php8

Опубликовано: / Просмотрено: 515 /

И вначале реклама, небольшой блок. Прошу не сердиться и не вносить ее в фильтры блокировщиков.

подробнее о рекламодателе можно узнать внутри блока
Спасибо. А теперь сам материал.

Пока не забыл, заметка на лету. Для Яндекса web-мастер можно создать Фиды, страница с rss, которая подгружается в соответствующий раздел, чтобы робот яндекса мог быстрее получать данные. Вот как я это реализовал в modx с применением pdotools и на версии php8+

 Специально делаю акцент, что php версии 8, потому что для ленты важна дата публикации и, если ее делать в локали не международного значения (а точнее в стандарте RFC 2822 ), то будет ошибка.  Соответственно, нужно как-то менять локаль, т.к. по умолчанию документ вернет на дефолтном языковом стандарте. В теории это можно  сделать с помощью сниппета и strftime, то с 8 версии php  strftime  является устаревшим методом -  https://www.php.net/manual/en/function.strftime.php  как замена, это IntlDateFormatter или intl

Но обо всем по порядку.

Вначале создаем пустой документ без шаблона, тип содержимого RSS, отключаем встроенный html-редактор, отключаем "кешируемый", заголовок по умолчанию, например feed. Если ЧПУ настроено, то страница будет доступна по адресу site.com/feed.rss ...

в нем пишем такой код

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>

<title>[[++site_name]] - Лента блога</title>

<link />[[!++site_url]]blog

<description>Свежая информация</description>

<atom:link href="[[~[[*id]]? &amp;scheme=`full`]]" rel="self" type="application/rss+xml">

<language>ru</language>

[[pdoResources?

&parents=`2,3,4,5` 

&depth=`1`

&limit=`10`

&includeContent=`1`

&tpl=`rssTpl`

&sortby=`publishedon`

&sortdir=`DESC`

&showUnpublished=`0`]]

</atom:link></channel>

</rss>

Что здесь? если не обращать внимание на специфический код для rss, то тут вызывается pdoResources, входящий в пакет pdoTools, в нем мы указывает родительские элементы, например те ресурсы, у которые collections и, самое главное, шаблон записей  rssTpl - то есть чанк, в котором формируется информация о материалах

А он уже у меня такой:

<item>

<title>[[+pagetitle:htmlent]]</title>

<link>[[+uri:prepend=`[[!++site_url]]`]]</link>

<pubDate>[[+publishedon:dateRFC2822]]</pubDate>

<description><![CDATA[[[+description:stripTags:ellipsis=`400`:htmlspecialchars]]<p>[[+introtext:removeLinks:default=`[[+introtext:removeLinks:ellipsis=`600`]]`]]</p>]]></description>

<guid isPermaLink="true">[[++site_url]][[~[[+id]]]]</guid>

</item>

Что здесь? 

Дата публикации, обрабатываю с помощью своего сниппета dateRFC2822, которая приводит дату в необходимый формат. strftime устаревший, а DateTime еще и понимает RFC2822 Код снипета: 

<?php

$date = new DateTime('@'. $input);

$date->setTimezone(new DateTimeZone('UTC'));

return $date->format(DateTime::RFC2822);

В описании у меня применяется сниппет removeLinks, он удаляет из аннотации ссылки, шрифт с иконками и изображения, чтобы был чистый текст длиной 600 символов

<?php

$modx->getParser()->processElementTags('', $input, true, true);

$input = preg_replace('/<a[^>]*>(.*?)<\/a>/is', '$1', $input);

$input = preg_replace('/<img[^>]*>/i', '', $text); // Удалить теги img

$input = preg_replace('/<i[^>]*>(.*?)<\/i>/is', '$1', $input); // Удалить теги i

return $input;

Пишу заметку ночью, в чанке поидее по deault нужно другой плейсхолдер указать. Это самый простейший вариант получения RSS ленты в modx, который можно расширить и усовершенствовать.И не забывайте про безопасность кода.

 

 


Теги: