MODX Sitemap для мультиязычного сайта с использованием Babel
Всем привет! К сожалению я не знал что для публикации статьи нужен минимальный рейтинг в 10 балов и по окончанию статьи я понял что не могу её опубликовать((. В итоге выложу её в Вопросах, надеясь на то что администраторы допустят её к просмотру, так как полезность статьи субъективна, но мне бы она помогла если бы я искал сейчас это решение!
Суть
Не давно столкнулся с проблемой генерации файла Sitemap для разных контекстов и наткнулся на хорошую статью, её я и буду брать как источник.
В общем, проблема предыдущей статьи в том что не всем новичкам сразу становится ясным, что автор использовал не стандартный синтаксис MODX из коробки, а использовал «Fenom». Так как я сам являюсь новичком в разработке на MODX и не особо дружу с феномом, я решил переписать оригинальную статью, но с использованием стандартного синтаксиса.
Это моя первая и надеюсь не последняя статья в нашем сообществе, так что не судите строго.
И так приступим!
Во-первых, обязательно прочтите рекомендации гугла по поводу разметки файла Sitemap для мультиязычного сайта тут, а вкратце:
Что нужно?
1. PdoSitemap
2. Babel
3. Ну и на примере моего сайта 2 контекста, один «Web» стандартный и второй «En» для английской версии сайта.
Шаг 1.
В базовом контексте (Web), создаём ресурс Sitemap.xml(тип:XML, Опубликован, не показывать в меню). Именно в базовом контексте. Далее, в шаблоне или ресурсе(как Вам удобно) выводим карту сайта с помощью pdoSitemap:
В чанке tplWrapper пишем следующее:
в Чанке rowtpl пишем:
Далее, создаём чанк xhtmltpl со следующим содержимым:

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

примерно так должно получится!
Не забываем поблагодарить автора оригинальной статьи @iWatchYouFromAfar!
Всем удачи!!!
Суть
Не давно столкнулся с проблемой генерации файла 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!
Всем удачи!!!
Комментарии: 8
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Есть готовое решение:
@Nursultan
Я бы на вашем месте удалил эту статью. Переписать {$id} на [[+id]] или {$_modx->config.modx_charset} на [[++modx_charset]] не составляет труда. Достаточно лишь зайти в документацию.
P.S.
Благодарностей в сообществе MODx к сожалению не так много. Что демотивирует писать полезные статьи.
Это, наверное, настолько мизерно, что вы не заметите это. Точно не могу ответить на этот вопрос.
- 1 сниппет
- 1 плагин
- 1 вкладку в ресурсы в которой 4 таба с настройками
- Словари
- Настройки системные
- Пространство имён
- Вкладку в меню, которое на многих сайтах и так перегружено
и т.д.Я предложил без написания костылей или как высказался @Aleksandr Huz, без велосипедов, довольно простое, легкое и универсальное решение по генерации сайтмапа для мультиязычных сайтов. Ничего лишнего устанавливать не придется, используется то, что 100% будет на почти всех мультиязычных сайтах.
Другое дело если вы пользуетесь всем функционалом компонента SEO Tab. В этом случае, конечно, лучше использовать его.
Но а я предпочитаю не устанавливать тонну компонентов на проекты, а искать более оптимальные решения.
Нашел ошибочку в чанке rowtpl,
одна t лишняя
И вопрос- зачем создавать перевод sitemap.xml? Нам ведь не нужен еще один sitemap?