MODX Sitemap для мультиязычного сайта с использованием Babel

Всем привет! К сожалению я не знал что для публикации статьи нужен минимальный рейтинг в 10 балов и по окончанию статьи я понял что не могу её опубликовать((. В итоге выложу её в Вопросах, надеясь на то что администраторы допустят её к просмотру, так как полезность статьи субъективна, но мне бы она помогла если бы я искал сейчас это решение!

Суть
Не давно столкнулся с проблемой генерации файла Sitemap для разных контекстов и наткнулся на хорошую статью, её я и буду брать как источник.
В общем, проблема предыдущей статьи в том что не всем новичкам сразу становится ясным, что автор использовал не стандартный синтаксис MODX из коробки, а использовал «Fenom». Так как я сам являюсь новичком в разработке на MODX и не особо дружу с феномом, я решил переписать оригинальную статью, но с использованием стандартного синтаксиса.
Это моя первая и надеюсь не последняя статья в нашем сообществе, так что не судите строго.
И так приступим!
Во-первых, обязательно прочтите рекомендации гугла по поводу разметки файла Sitemap для мультиязычного сайта тут, а вкратце:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>http://www.example.com/english/page.html</loc>
    <xhtml:link 
               rel="alternate"
               hreflang="de"
               href="http://www.example.com/deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="de-ch"
               href="http://www.example.com/schweiz-deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="en"
               href="http://www.example.com/english/page.html"/>
  </url>
  <url>
    <loc>http://www.example.com/deutsch/page.html</loc>
    <xhtml:link 
               rel="alternate"
               hreflang="de"
               href="http://www.example.com/deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="de-ch"
               href="http://www.example.com/schweiz-deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="en"
               href="http://www.example.com/english/page.html"/>
  </url>
  <url>
    <loc>http://www.example.com/schweiz-deutsch/page.html</loc>
    <xhtml:link 
               rel="alternate"
               hreflang="de"
               href="http://www.example.com/deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="de-ch"
               href="http://www.example.com/schweiz-deutsch/page.html"/>
    <xhtml:link 
               rel="alternate"
               hreflang="en"
               href="http://www.example.com/english/page.html"/>
  </url>
</urlset>

Что нужно?
1. PdoSitemap
2. Babel
3. Ну и на примере моего сайта 2 контекста, один «Web» стандартный и второй «En» для английской версии сайта.

Шаг 1.
В базовом контексте (Web), создаём ресурс Sitemap.xml(тип:XML, Опубликован, не показывать в меню). Именно в базовом контексте. Далее, в шаблоне или ресурсе(как Вам удобно) выводим карту сайта с помощью pdoSitemap:
[[pdoSitemap?
	&tplWrapper=`wrappertpl`
	&tpl=`rowtpl`
]]
Вводите свои параметры, но не указывайте параметр &Context, а то не сработает.. Теперь создаём два кастомных чанка.

В чанке tplWrapper пишем следующее:
<?xml version="1.0" encoding="[[++modx_charset]]"?>
<urlset xmlns="[[+schema]]"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
    [[+output]]
</urlset>
Это чанк обёртка в которой мы будем помещать урлы. Google говорит использовать пространство имен xhtml в карте сайта, если прочли рекомендации гугла, то тут вопросов не должно быть.

в Чанке rowtpl пишем:
<url>
    <loc>[[+url]]</loc>
    <lastmod>[[+date]]</lastmod>
    <changefreq>[[+update]]</changefreq>
    <priority>[[+priority]]</priority>
    
    [[BabelLinks?
    	&resourceId=`[[+id]]`
    	&showCurrent=`1`
    	&tpl=`xhttmltpl`
    ]] 
</url>
В атрибуте loc — мы указываем урл страницы текущего контекста (главного). Который мы генерим сниппетом pdoSitemap. lastmod, changefreq, priority — ноу комментс, гуглите если хотите узнать про эти атрибуты. А далее, с помощью прекрасного сниппета babelLinks (который идет в коробке компонента Babel), мы генерим те самые, заветные атрибуты <xhtml:link>!
Очень важно указать в параметре как идентификатор ресурса, так и значение 1/true, в параметре showCurrent. Этим самым — мы выводим тег <xhtml:link> для страницы активного контекста и для связанных страниц из других контекстов.

Далее, создаём чанк xhtmltpl со следующим содержимым:
<xhtml:link rel="alternate" hreflang="[[+cultureKey]]" href="[[+url]]"/>
Ну и наконец чистим кеш и создаём копию(перевод) ресурса для контекста En(ставим галочки Скрыть из меню, убираем галочку опубликован)


Заходим по ссылке Вашсайт.com/sitemap.xml и видим кашу!!! Но не расстраивайтесь, вся разметка на месте, просто откройте исходный код.

примерно так должно получится!


Не забываем поблагодарить автора оригинальной статьи @iWatchYouFromAfar!

Всем удачи!!!
Nursultan
02 апреля 2020, 09:09
modx.pro
1 632
+2

Комментарии: 8

Aleksandr Huz
02 апреля 2020, 10:18
0
Если бы вы дочитали статью до конца, то не писали бы эту статью.
Есть готовое решение:
[[!StercSeoSiteMap? &contexts=`web,en`]]
    iWatchYouFromAfar
    02 апреля 2020, 12:19
    +1
    Этот доп тащит за собой функционал и интерфейс, который зачастую не многим нужен. Например мои клиенты отказались от него. Я пользуюсь своим вариантом, без установки лишних компонентов. Но да, есть готовый компонент и его можно использовать.

    @Nursultan
    Я бы на вашем месте удалил эту статью. Переписать {$id} на [[+id]] или {$_modx->config.modx_charset} на [[++modx_charset]] не составляет труда. Достаточно лишь зайти в документацию.

    P.S.
    Благодарностей в сообществе MODx к сожалению не так много. Что демотивирует писать полезные статьи.
      Nursultan
      02 апреля 2020, 20:40
      0
      действительно не увидел, но разве установка доп компонентов не грузит систему? Лучше использовать те допы которые уже установлены, разве нет?
        Aleksandr Huz
        02 апреля 2020, 21:13
        0
        Лучше использовать те допы которые уже установлены, разве нет?
        Если есть время или не нравиться лишняя вкладка в ресурсе, то может и лучше. Я предпочитаю использовать готовое и проверенное решение, а не придумывать велосипед.

        но разве установка доп компонентов не грузит систему?
        Это, наверное, настолько мизерно, что вы не заметите это. Точно не могу ответить на этот вопрос.
          iWatchYouFromAfar
          04 апреля 2020, 02:59
          0
          Систему может и не загрузит. А вот лишнего и скорее всего не нужного вам функционала точно запихнет. SEO Tab устанавливает

          1. 1 сниппет
          2. 1 плагин
          3. 1 вкладку в ресурсы в которой 4 таба с настройками
          4. Словари
          5. Настройки системные
          6. Пространство имён
          7. Вкладку в меню, которое на многих сайтах и так перегружено
          и т.д.

          Я предложил без написания костылей или как высказался @Aleksandr Huz, без велосипедов, довольно простое, легкое и универсальное решение по генерации сайтмапа для мультиязычных сайтов. Ничего лишнего устанавливать не придется, используется то, что 100% будет на почти всех мультиязычных сайтах.

          Другое дело если вы пользуетесь всем функционалом компонента SEO Tab. В этом случае, конечно, лучше использовать его.

          Но а я предпочитаю не устанавливать тонну компонентов на проекты, а искать более оптимальные решения.
      Fiesto
      07 июня 2021, 21:38
      0
      Спасибо большое за гайд! Возможно стоит внести коррективы. Согласно требованию гугла тег url необходим для каждой страницы, потому лучше в вызов pdoSitemap включить все контексты
      &context=`web,context1,context2`
        Евгений
        23 февраля 2024, 07:00
        0
        Спасибо за перевод, сам не дорос еще до fenom, поэтому мне было полезно.
        Нашел ошибочку в чанке rowtpl,
        &tpl=`xhttmltpl`
        одна t лишняя
        И вопрос- зачем создавать перевод sitemap.xml? Нам ведь не нужен еще один sitemap?
        и создаём копию(перевод) ресурса для контекста En
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          8