Добро пожаловать на сайт SEDBY

Исправляем RSS-карту для Яндекс Вебмастер

  • 231 просмотр
  • 20 мая, 2024
  • Обновлено: 20 мая, 2024
  • admin
  • Время чтения: 5 минут
  • 1 (Подробно)

При добавлении сайта в сервисы Google Search Console и Яндекс Вебмастер, вам, в числе прочих, предлагается указать ссылки на карты сайта (Sitemap). Речь, конечно, не о HTML-страницах, а о XML-картах, которые отдают поисковикам структурированную информацию о страницах и разделах. Выглядит это примерно так:

RSS-поток, создаваемый коробочным модулем Cotonti RSS

Как видим, это полезный функционал, на который поисковые системы ориентируются при индексации контента.

Реализация карты сайта на движке Cotonti Siena

Пользователи Cotonti Siena могут добавить карты сайта в оба сервиса (GSC и ЯВ) с использованием двух “коробочных” расширений. Это:

  1. Плагин Sitemap
  2. Модуль 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 последних страниц?

Новый комментарий

Имя:
Для редактирования комментария осталось 10 минут
Блок пользователя
Регистрация на нашем сайте позволит вам общаться на форумах и получить доступ к другому полезному функционалу
Вы вошли как Гость