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 и не особо дружу с феномом, я решил переписать оригинальную статью, но с использованием стандартного синтаксиса.
Это моя первая и надеюсь не последняя статья в нашем сообществе, так что не судите строго.
И так приступим!
<?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
Если бы вы дочитали статью до конца, то не писали бы эту статью.
Есть готовое решение:
Есть готовое решение:
[[!StercSeoSiteMap? &contexts=`web,en`]]
- 1 сниппет
- 1 плагин
- 1 вкладку в ресурсы в которой 4 таба с настройками
- Словари
- Настройки системные
- Пространство имён
- Вкладку в меню, которое на многих сайтах и так перегружено
Этот доп тащит за собой функционал и интерфейс, который зачастую не многим нужен. Например мои клиенты отказались от него. Я пользуюсь своим вариантом, без установки лишних компонентов. Но да, есть готовый компонент и его можно использовать.
@Nursultan
Я бы на вашем месте удалил эту статью. Переписать {$id} на [[+id]] или {$_modx->config.modx_charset} на [[++modx_charset]] не составляет труда. Достаточно лишь зайти в документацию.
P.S.
Благодарностей в сообществе MODx к сожалению не так много. Что демотивирует писать полезные статьи.
@Nursultan
Я бы на вашем месте удалил эту статью. Переписать {$id} на [[+id]] или {$_modx->config.modx_charset} на [[++modx_charset]] не составляет труда. Достаточно лишь зайти в документацию.
P.S.
Благодарностей в сообществе MODx к сожалению не так много. Что демотивирует писать полезные статьи.
действительно не увидел, но разве установка доп компонентов не грузит систему? Лучше использовать те допы которые уже установлены, разве нет?
Лучше использовать те допы которые уже установлены, разве нет?Если есть время или не нравиться лишняя вкладка в ресурсе, то может и лучше. Я предпочитаю использовать готовое и проверенное решение, а не придумывать велосипед.
но разве установка доп компонентов не грузит систему?Это, наверное, настолько мизерно, что вы не заметите это. Точно не могу ответить на этот вопрос.
Систему может и не загрузит. А вот лишнего и скорее всего не нужного вам функционала точно запихнет. SEO Tab устанавливает
Я предложил без написания костылей или как высказался @Aleksandr Huz, без велосипедов, довольно простое, легкое и универсальное решение по генерации сайтмапа для мультиязычных сайтов. Ничего лишнего устанавливать не придется, используется то, что 100% будет на почти всех мультиязычных сайтах.
Другое дело если вы пользуетесь всем функционалом компонента SEO Tab. В этом случае, конечно, лучше использовать его.
Но а я предпочитаю не устанавливать тонну компонентов на проекты, а искать более оптимальные решения.
Я предложил без написания костылей или как высказался @Aleksandr Huz, без велосипедов, довольно простое, легкое и универсальное решение по генерации сайтмапа для мультиязычных сайтов. Ничего лишнего устанавливать не придется, используется то, что 100% будет на почти всех мультиязычных сайтах.
Другое дело если вы пользуетесь всем функционалом компонента SEO Tab. В этом случае, конечно, лучше использовать его.
Но а я предпочитаю не устанавливать тонну компонентов на проекты, а искать более оптимальные решения.
+++
Спасибо большое за гайд! Возможно стоит внести коррективы. Согласно требованию гугла тег url необходим для каждой страницы, потому лучше в вызов pdoSitemap включить все контексты
&context=`web,context1,context2`
Спасибо за перевод, сам не дорос еще до fenom, поэтому мне было полезно.
Нашел ошибочку в чанке rowtpl,
И вопрос- зачем создавать перевод sitemap.xml? Нам ведь не нужен еще один sitemap?
Нашел ошибочку в чанке rowtpl,
&tpl=`xhttmltpl`
одна t лишняяИ вопрос- зачем создавать перевод sitemap.xml? Нам ведь не нужен еще один sitemap?
и создаём копию(перевод) ресурса для контекста En
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.