Исправляем RSS-карту для Яндекс Вебмастер
- 243 просмотра
- 20 мая, 2024
- Обновлено: 20 мая, 2024
- admin
- Время чтения: 5 минут
- 1 (Подробно)
При добавлении сайта в сервисы Google Search Console и Яндекс Вебмастер, вам, в числе прочих, предлагается указать ссылки на карты сайта (Sitemap). Речь, конечно, не о HTML-страницах, а о XML-картах, которые отдают поисковикам структурированную информацию о страницах и разделах. Выглядит это примерно так:
![RSS-поток, создаваемый коробочным модулем Cotonti RSS](https://sed.by/pics/thumbs/140/img-140-966x644-width.jpg)
Как видим, это полезный функционал, на который поисковые системы ориентируются при индексации контента.
Реализация карты сайта на движке Cotonti Siena
Пользователи Cotonti Siena могут добавить карты сайта в оба сервиса (GSC и ЯВ) с использованием двух “коробочных” расширений. Это:
- Плагин Sitemap
- Модуль RSS
C первым проблем не возникает. В соответствующем разделе просто укажите ссылку на XML-карту вида:
https://site.tld/index.php?r=sitemap&a=index
Если вы используете расширение URL Editor и пресет Handy, можно и так:
https://site.tld/sitemap.xml
А что же модуль RSS? Google Search Console прекрасно принимает и распознает RSS-карту сайта по ссылкам вида:
https://site.tld/rss
Однако с Яндекс Вебмастер есть проблема: при попытке добавить RSS-поток в качестве карты сайта получаем ошибку. После небольшого изучения выяснилось, что проблема скорее не в самом функционале, а в разметке шаблона для оформления RSS-фида. Ее, как известно, определяет дефолтный шаблон, расположенный по адресу modules/rss/tpl и имеющий следующий вид:
<!-- BEGIN: MAIN --> <?xml version='1.0' encoding='{RSS_ENCODING}'?> <rss version='2.0'> <channel> <title>{RSS_TITLE}</title> <link>{RSS_LINK}</link> <description>{RSS_DESCRIPTION}</description> <generator>Cotonti</generator> <language>{RSS_LANG}</language> <pubDate>{RSS_DATE}</pubDate> <!-- BEGIN: ITEM_ROW --> <item> <title>{RSS_ROW_TITLE}</title> <description><![CDATA[{RSS_ROW_DESCRIPTION}]]></description> <pubDate>{RSS_ROW_DATE}</pubDate> <link><![CDATA[{RSS_ROW_LINK}]]></link> </item> <!-- END: ITEM_ROW --> </channel> </rss> <!-- END: MAIN -->
Вроде изъянов нет, но Яндексу не нравится сразу несколько моментов. Прежде, чем перейти к ним, скопируем дефолтный шаблон rss.tpl в папку с нашей темой themes/ИМЯ_ТЕМЫ/modules/rss/ и дальше работать будет только с ним.
Правильное оформление RSS формата
Здесь все просто. Прежде всего, правильно оформим контейнер rss и добавим в контейнер channel элемент atom. Примерно так:
<!-- BEGIN: MAIN --> <?xml version='1.0' encoding='{RSS_ENCODING}'?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> <title>{RSS_TITLE}</title> <link>{RSS_LINK}</link> <description>{RSS_DESCRIPTION}</description> <generator>Cotonti</generator> <language>{RSS_LANG}</language> <pubDate>{RSS_DATE}</pubDate> <atom:link href="{PHP.cfg.mainurl}/{PHP|cot_url('rss')}" rel="self" type="application/rss+xml"/> <!-- BEGIN: ITEM_ROW --> <item> <title>{RSS_ROW_TITLE}</title> <description><![CDATA[{RSS_ROW_DESCRIPTION}]]></description> <pubDate>{RSS_ROW_DATE}</pubDate> <link><![CDATA[{RSS_ROW_LINK}]]></link> </item> <!-- END: ITEM_ROW --> </channel> </rss> <!-- END: MAIN -->
Обратите внимание, что свойство href требует абсолютной ссылки. Отсюда использование элемента 'mainurl' глобального массива настроек $cfg. Теперь займемся основной проблемой.
Отсутствие элемента GUID
Сначала добавим данный элемент в регулярный блок ITEM_ROW шаблона rss.tpl
<!-- BEGIN: MAIN --> <?xml version='1.0' encoding='{RSS_ENCODING}'?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> <title>{RSS_TITLE}</title> <link>{RSS_LINK}</link> <description>{RSS_DESCRIPTION}</description> <generator>Cotonti</generator> <language>{RSS_LANG}</language> <pubDate>{RSS_DATE}</pubDate> <atom:link href="{PHP.cfg.mainurl}/{PHP|cot_url('rss')}" rel="self" type="application/rss+xml"/> <!-- BEGIN: ITEM_ROW --> <item> <title>{RSS_ROW_TITLE}</title> <description><![CDATA[{RSS_ROW_DESCRIPTION}]]></description> <pubDate>{RSS_ROW_DATE}</pubDate> <link><![CDATA[{RSS_ROW_LINK}]]></link> <guid><![CDATA[{RSS_ROW_LINK}]]></guid> </item> <!-- END: ITEM_ROW --> </channel> </rss> <!-- END: MAIN -->
Как видим, мы просто продублировали элемент link. Теперь же попробуем разобраться с тем, правильно ли мы поступили, и что же такое правильный GUID. Простыми словами, это глобальный универсальный идентификатор ссылки на любой из ресурсов вашего сайта. Вот какое определение дает Википедия:
GUID (Globally Unique Identifier) – статистически уникальный 128-битный идентификатор. Его главная особенность – уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов.
Применительно к нашему вопросу это пермалинк, т.е. ссылка на страницу или раздел, которая никогда не меняется, какие бы правки вы не вносили в настройки. На ум сразу приходит модуль страниц и отношение “id – alias”. В Котонти любая страница при создании получает уникальный id. Однако при этом существует два параметра, которые уникальными быть не могут априори:
- код раздела,
- алиас страницы.
Это означает, что при их изменении изменится и наш GUID. А это уже контрпродуктивно.
Если запутались, поясним на примере. Допустим, в разделе “Блог” мы создали новую страницу и присвоили ей алиас css-variables. В таком случае наша страница будет отзываться по двум ссылкам:
https://sed.by/blog/css-variables https://sed.by/blog/48
С дублями Cotonti борется правильно – с помощью тега link:
<link rel="canonical" href="https://sed.by/blog/css-variables">
Это означает, что из двух ссылок канонической будет считаться та, которая использует alias. И это правильно, поскольку сама идея его использования предполагает, что такая ссылка должна считаться приоритетной. Но правильно ли будет считать ее уникальным пермалинком?
Предположим, что мы решили переместить нашу страницу в другой раздел, изменить или удалить алиас. Как вариант – изменить код раздела, в котором она размещена. Сразу же изменится и наш кандидат в GUID. Снова плохо?
Не совсем, поскольку выход все же есть. В примере с нашей страницей ссылок на самом деле не две, а четыре:
https://sed.by/blog/css-variables https://sed.by/blog/48 https://sed.by/page?al=css-variables https://sed.by/page?id=48
Третья и четвертая ссылки будут доступны в качестве неканонических. Четвертую можно считать “вечной”, поскольку она не зависит ни от алиаса, ни от размещения страницы в структуре сайта.
Если вы не используете плагин URL Editor, две последние ссылки будут иметь следующий вид:
https://sed.by/page.php?al=css-variables https://sed.by/page.php?id=48
Окончательный вердикт
Спецификация RSS гласит:
It's recommended that you provide the guid, and if possible make it a permalink. This enables aggregators to not repeat items, even if there have been editing changes.
A frequently asked question about <guid>s is how do they compare to <link>s. Aren't they the same thing? Yes, in some content systems, and no in others. In some systems, <link> is a permalink to a weblog item. However, in other systems, each <item> is a synopsis of a longer article, <link> points to the article, and <guid> is the permalink to the weblog entry.
Другими словами, GUID или пермалинк отдается на откуп вебмастеру. Если вы хотите “затянуть все гайки” и посмотреть, как это будут трактовать поисковые системы, можно сформировать перманентную ссылку на элемент на основе приведенных “неубиваемых”. В зависимости от использования плагина URL Editor, это будет
https://sed.by/page?id=48
или
https://sed.by/page.php?id=48
Если же рисковать нет желания, а ситуации с изменением алиасов или родительских разделов у вас встречаются действительно редко, оставьте все как есть. В этом случае пермалинк будет и канонической ссылкой. В нашем шаблоне rss.tpl с этим справится уже указанный элемент guid с дефолтной ссылкой на страницу:
<guid><![CDATA[{RSS_ROW_LINK}]]></guid>
Заключение
У вас возникнет логичный вопрос: зачем расписывать все в подробностях если решение до примитивности простое? Ответ на него следующий: данная статья написана с целью объяснить “зачем это надо и как это работает”, а не для того, чтобы дать быстрое решение. К тому же, практика показывает, что “быстрые решения” всегда вызывают такие же логичные вопросы и все равно требуют детальных объяснений.
Надеемся, что наша публикация помогла и вам ответить на вопросы. Как обычно, для фидбека используйте комментарии и форумы.
Ранее мы рассказывали о том, как исправить ошибку Premature End of File в XML-фиде Яндекс Бизнес.
Потому что в настройках модуля именно такое количество задано по умолчанию
А почему в rss-фиде выводится только 40 последних страниц?
Новый комментарий