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 темы, чтобы изменить нужный пункт меню ...

Читать

Чем заменить file_create_url в Drupal 9/10

Январь 9, 2024 г.

Функция file_create_url устаревает, начиная с версии 9.3, а в 10й версии она уже отсутствует. Документация предлагает воспользоваться реализацией интерфейса \Drupal\Core\File\FileUrlGeneratorInterface, чтобы заместить устаревающую функцию в вашем ...

Читать

 

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

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



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