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 связывает машинное имя карты с именем языка. У меня он задаётся дважды, что связано с двуязычными странами типа Бельгии и Канады. И для них приходится сначала править префикс, а потом уже выполнять основную задачу.

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


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

Корзина не пуста - изменим стиль пункта меню

Август 2, 2023 г.

Использую Drupal Commerce, и в меню у меня есть пункт "Корзина", со ссылкой на корзину пользователя. Хочется, чтобы стиль пункта меню менялся, если корзина не пуста. Я буду использовать hook_preprocess_menu темы, чтобы изменить нужный пункт меню ...

Читать

Создание контроллера для скачивания файла в Drupal

Сентябрь 6, 2023 г.

Пример кода, реализующий endpoint скачиваемого файла. [crayon-698429e69d6e8322260159/] Кроме контроллера, вам потребуется еще задать маршрут. Пример описания маршрута: [crayon-698429e69d6ef259514869/]

Читать

Чем заменить drupal_get_path() в Drupal 9/10

Январь 9, 2024 г.

Функция считается устаревшей, начиная с версии ядра 9.3, в 10-й версии функция удалена из кода. В новом API нужно воспользоваться одним из сервисов ядра, которые реализуют нужную функцию. Сервис extension.list.module - реализует функции, связанные ...

Читать

Сохранение файла, полученного через форму в Drupal

Февраль 17, 2024 г.

Вы создали форму с полем типа file, и хотите сохранять файл как сущность друпала при отправке данных формы. [crayon-698429e69da06314886415/] Обычно объявления форм в Drupal 8+ размещаются в виде расширений класса FormBase в каталоге модуля /scr/Form/*. ...

Читать
 

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

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



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