XML карта сайта для многоязычных проектов на Drupal

Для начала разберемся: что мы пытаемся построить. Ожидается, что у нас есть корневой файл sitemap.xml, который содержит список языковых xml карт.

Для двух языков это может выглядеть вот так:

Т.е. каждый язык у нас имеет собственную карту сайта.

Помимо этого, каждая описываемая ссылка в карте должна иметь перекрестную адресацию на другие языки (т.н. translation set).

В примере выше мы видим, что карта en-gb (английский, Великобритания) содержит всего две ссылки (Number of URLs).

Первая из них имеет вариант для языка по умолчанию для сайта (у ссылки на языке «по умолчанию» отстутствует префикс языка) — потому «translation set» состоит из 2х ссылок, а вторая переведена еще на два языка, а потому там три ссылки.

Приведенные выше примеры построены на базе модуля simple_sitemap версии 4. «Из коробки» нужного результата не достичь, потому мы обсудим как правильно настроить сам модуль, какой дополнительный код потребуется и даже добавим небольшой патч.

Патчим модуль

Начнем с самого простого — с патча.

Проблема модуля в том, что он отфильтровывает сущности по полю published или status, требуя чтобы значение поля было «1». Это отлично работает, но только не в случае, если у нас многоязычный сайт.

Для многоязычного сайта это будет работать так: все переводы статьи будут попадать в карту сайта только если публикация на основном языке опубликована и наоборот. Но у каждого из переводов есть свой статус «опубликовано» и нужно руководствоваться его значением.

Собирается это условие в
src/Plugin/simple_sitemap/UrlGenerator/EntityUrlGenerator.php

Просто закомментируем этот код и включим это изменение как патч в настройки composer.json

Настойки модуля simple_sitemap

4я версия модуля позволяет настраивать несколько карт и корневой список для них. Но не даёт нам возможности связать как то их с конкретным языком (это мы будем делать как дополнительный код).

В 3й версии не было и этой возможности, приходилось писать много дополнительного кода, чтобы организовать нужную структуру из карт. Прогресс на лицо!

Типы карт

Для начала настроим два типа карт (/admin/config/search/simplesitemap/types)

Корневой (sitemap index) включает только генератор «Sitemap URL», т.е. ссылки на карты. А default — включает остальные генераторы.

Карты сайта

На базе созданных типов можно создавать сами карты.

Списки публикаций для каждого языка имеют свою карту, тип — default. А корневая карта использует тип «sitemap index«.

Настройки контента

Теперь нужно задать параметры, задав какой контент включать в карты сайта. Это делается вот тут — /admin/config/search/simplesitemap/entities. Каждый тип публикации нужно сконфигурировать в какую карту он входит. Настройки для каждой языковой карты одинаковые.

Без дополнительного кода, которым мы займемся ниже, такие настройки создадут нам идентичные карты сайта.

Дополнительный код

Модуль позволяет реализовать хук — HOOK_simple_sitemap_links_alter(&$links, $sitemap).

Он вызывается для каждой карты сайта, при этом поставляется список ссылок, которые были собраны согласно настройкам контента.

Основная задача — отфильтровать неопубликованные элементы и ссылки, относящиеся к другим языкам.

Побочные задачи — это поменять языковые коды, которые в Drupal отличаются от того, что например ожидает google. А еще — удалить дубли ссылок, которые могут возникать при добавлении ссылок вручную и приходить из настроек меню.

Т.к. требуемый набор языков — зависит от вашей частной задачи, то я могу привести свой код лишь как пример того, как это сделано для одного из моих проектов, в котором используется более 15 языков. Для себя вам придется этот код адаптировать.

Массив $hreflang_variants связывает машинное имя карты с именем языка. У меня он задаётся дважды, что связано с двуязычными странами типа Бельгии и Канады. И для них приходится сначала править префикс, а потом уже выполнять основную задачу.

У вас эта карта будет собственная, и, возможно, вам не надо будет править префикс. Код будет вырождаться до следующего варианта:


Написать комментарий

Мало букафф? Читайте есчо !

Модификация тела письма перед отправкой в Drupal

Июнь 9, 2023 г.

Рассмотрим два варианта, как зацепиться к отправляемым письмам и внести туда свои изменения. Первый вариант заключается в прямом изменении тела письма перед отправкой. Для этого мы реализуем hook_mail_alter(&message). MAIL ALTER хук Переменная ...

Читать

Реализация блока с внедрением формы

Май 11, 2023 г.

См. основной материал для введения. В имплементации блока требуется сформировать набор переменных и передать его в шаблон. Шаблон был ранее объявлен в основном файле модуля, исходя из макета. [crayon-66a412c5710b3365650951/] В макете присутствуют ...

Читать

 

Комментарии к «XML карта сайта для многоязычных проектов на Drupal»

Понравилась статья? Есть вопросы? - пишите в комментариях.



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