Когда-то я думал, что публиковать статьи с сайта в Дзен — это просто включить где-то в настройках галочку. Оказалось, галочки нет. Есть RSS-лента, которую Joomla генерирует «из коробки», и есть Дзен, который эту ленту читает — и молча отклоняет. Потому что в ней нет того, что он требует.
Эта статья о том, как я сделал ленту, которая прошла модерацию. Со всеми техническими деталями и граблями, на которые наступил.
Сайт у меня на Joomla 4/5, блог с техническими статьями. Задача была простая: автоматически публиковать их в Дзене, чтобы не дублировать контент вручную.
Стандартный путь выглядит так. В Joomla есть встроенный RSS-фид для категории. Дзен умеет подключать такие ленты через студию. Казалось бы, всё. Но Дзен — не обычный RSS-ридер. У него свои требования к формату, и стандартная лента Joomla им не соответствует.
Первое, что требует Дзен, — это пространство имён dzen в корневом теге rss. Без него лента не считается «лентой для Дзена».
Второе — тег dzen:type в каждом элементе item. Он говорит Дзену, как публиковать статью. Для нативного кросс-постинга нужно значение native-yes. Если тега нет или стоит native-no, Дзен либо откажет, либо будет отправлять читателя на ваш сайт. А в 2026 году RSS-подключения с native-no почти не одобряют.
Третье — тег dzen:comment. Он разрешает комментарии под публикацией.
Четвёртое — полный текст статьи в теге content:encoded. Дзен требует не краткое описание, а полный HTML. Причём с ограниченным набором тегов: параграфы, ссылки, выделения, списки, цитаты, подзаголовки, картинки. Всё остальное — pre, code, table, script, iframe — либо вырезается, либо становится причиной отказа.
Пятое — минимум двадцать статей в ленте. Если меньше, Дзен не подключает.
Шестое — обложки не менее семисот пикселей по ширине.
Стандартная лента Joomla не умеет ничего из этого. Она генерируется файлом RssRenderer.php в папке libraries/src/Document/Renderer/Feed. Этот файл выводит только заголовок, ссылку, описание и дату. Никакого dzen:type, никакого content:encoded, никаких кастомных пространств имён.
Более того, стандартный CategoryFeedView не умеет обрабатывать свойство customElements, через которое можно было бы передавать дополнительные теги. Всё, что туда положишь, будет проигнорировано.
Поэтому путь один — править ядро. Или писать плагин. Я выбрал первое, потому что плагин требует больше кода, а задача разовая.
На сервере стоял атрибут -i на директориях libraries, templates и на configuration.php. Это защита от случайных изменений, которую ставит панель управления хостингом. Без её снятия файлы нельзя ни изменить, ни переименовать, ни удалить. Даже root-пользователем. Поэтому первым делом снял защиту с нужных путей.
Затем отредактировал RssRenderer.php. Первая правка — добавил namespace dzen в корневой тег rss. Вторая — внутри цикла по элементам добавил вывод content:encoded с полным текстом, dc:creator с автором, dzen:type со значением native-yes и dzen:comment со значением enabled.
Третья правка касалась обработки тегов pre и code. Технические статьи часто содержат код. Если просто вырезать pre, код превратится в голый текст без обёртки. Дзен такое не любит. Решение — обработать pre перед финальной очисткой, превратив его в параграф с переносами строк. Для этого используется регулярное выражение, которое находит все блоки pre, декодирует HTML-сущности несколько раз, убирает оставшиеся теги code, экранирует текст один раз и заменяет переносы строк на br.
После этого остаётся финальный фильтр разрешённых тегов. Он вырезает всё, что Дзен не принимает.
Отдельная история — лимит статей в ленте. В configuration.php параметр feed_limit по умолчанию стоит десять. Дзен требует минимум двадцать. Я поменял на двадцать пять. Но здесь есть нюанс: даже с feed_limit равным двадцати пяти лента отдаст только те статьи, которые Joomla отбирает для страницы блога. Если на странице выводится девять статей, то и в ленте будет девять. Пришлось увеличить параметры вывода в пункте меню.
После правок очистил кэш и проверил ленту. Количество элементов стало двадцать пять — достаточно для Дзена. Затем вернул атрибут -i на место.
Отдельно пришлось разобраться с картинкой. Поле image_intro в базе есть, но в ленту оно не попадало: Joomla не передаёт images в CategoryFeedView. Пришлось в ядровом FeedView.php дописать запрос к базе и формирование тега img с очисткой пути от #joomlaImage:// и декодированием %20. Без этого картинка подставлялась как корень сайта — https://jedig.ru/ — и Дзен её не видел.
Проверить готовность ленты просто. Откройте её в браузере и убедитесь, что в корневом теге есть xmlns:dzen, в каждом элементе есть dzen:type со значением native-yes и dzen:comment со значением enabled, есть content:encoded с полным текстом, картинка в начале description, и количество элементов не меньше двадцати. Можно прогнать через валидатор validator.w3.org/feed — он покажет, если что-то не соответствует стандарту.
Теперь про грабли, на которые я наступил.
Первая. Атрибут -i возвращается. Панель управления хостингом снова ставит его после сканирования или обновления. Если планируете правки, снимайте каждый раз.
Вторая. sed — плохой инструмент для правки PHP. В файле табы, а не пробелы, длинные строки с экранированием кавычек. Первая попытка через sed сломала синтаксис, php -l ругнулся. Пришлось заливать файл целиком через cat с heredoc.
Третья. strip_tags срезает pre и оставляет голый код. Без специальной обработки pre код в ленте превращается в текст без обёртки. Дзен может отклонить.
Четвёртая. Двойное экранирование. Внутри pre HTML-сущности могут быть закодированы дважды. html_entity_decode нужно вызывать несколько раз, иначе в ленте останутся артефакты вместо нормального текста.
Пятая. Лимит статей. Даже с feed_limit равным двадцати пяти лента отдаст только те статьи, которые Joomla отбирает для страницы блога.
Шестая. Картинка. Штатный HTMLHelper::_('image', ...) не справляется с путями Joomla 4/5, содержащими #joomlaImage://. Нужно вручную отрезать хеш и декодировать %20.
Седьмая. Дзен может отказать даже с идеальной лентой. В 2025–2026 годах платформа неохотно подключает RSS-каналы. Если откажет — дело не в ленте, а в политике платформы.
В итоге лента, которая проходит модерацию Дзена, состоит из стандартных тегов RSS, пространств имён atom, content, media, dc и dzen, тегов content:encoded и dc:creator для каждой статьи, тегов dzen:type и dzen:comment для каждой статьи, картинки из image_intro в начале description, полного текста без запрещённых тегов и минимум двадцати статей.
Дзен забирает статьи из ленты и публикует их у себя. Ссылка на оригинал сохраняется, но читатель остаётся в Дзене.
Стоит ли оно того. Если у вас Joomla и вы хотите кросс-постинг в Дзен — да, стоит. Это разовая работа на полчаса-час, которая избавляет от ручного дублирования контента.
Если у вас другая CMS — принцип тот же. Нужно взять её RSS-рендерер и добавить туда недостающие теги. В WordPress это делается через плагины или фильтры rss2_item, в других системах — правкой шаблона ленты.
Альтернатива — плагины вроде JoomRSS или obRSS, которые умеют объединять ленты и настраивать формат. Но для одной задачи проще сделать руками, чем разбираться с чужим кодом.
Что бы я сделал иначе. Если бы начинал заново — сначала изучил бы требования Дзена, а потом лез в код. Я потратил несколько итераций на правки, которые не нужны. Сначала добавил media:content, который Дзен не требует. Потом пытался использовать customElements, который Joomla не обрабатывает. Потом сломал экранирование в pre. Потом потратил время на override FeedView.php в шаблоне, который Joomla игнорирует для RSS, — править нужно ядровый файл.
Правильный порядок такой. Прочитать требования Дзена к формату. Посмотреть, что генерирует Joomla по умолчанию. Найти разницу и закрыть её. Проверить валидатором. Подать в Дзен.
А не наоборот: сделать красиво, а потом удивляться, почему не работает.
Если вы тоже настраиваете кросс-постинг с Joomla в Дзен — пишите в комментариях, что получилось, а что нет. Возможно, вместе найдём решение для случаев, где стандартный подход не срабатывает.
Оригинал статьи: https://jedig.ru/joomla-virtuemart/782-kak-ya-nastroil-kross-posting-s-joomla-v-dzen-rss-lenta-kotoraya-proshla-moderatsiyu