Пока не забыл, заметка на лету. Для Яндекса 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]]? &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, который можно расширить и усовершенствовать.И не забывайте про безопасность кода.