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

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


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

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

Использование контекста публикации во views

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

У вас есть публикация и в ней задана категория (таксономия). Задача - использовать значение выбранной категории во view, которая отображается на данной ...

Читать

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

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

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

Читать

 

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

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



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