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

Май 19, 2023 г.

Посмотрим как получить непосредственный доступ к файлу без загрузки файла в хранилище, при его загрузке в поле типа "file" Form API. Много гайдов посвящено тому как использовать поле managed_file, а для unmanaged случая считается, что разработчик ...

Читать

Не появляется форма переиндексации на странице /admin/config/search/search-api/index/

Июль 25, 2024 г.

Если ваш view базируется на search API источнике данных, то важно, чтобы данные были проиндексированы. Но иногда форма переиндексации отсутствует на странице ...

Читать

Программное создание статьи с переводом в Drupal

Август 10, 2023 г.

Допустим, вы получаете следующие данные - заголовок, текст статьи, и теги. При этом данные поставляются на двух языках - 'ru' и 'en'. Вам требуется программно сохранить статью и её перевод. Я полагаю, что уже активирован модуль Content Translation, ...

Читать

Переадресация на основной домен в Drupal

Июль 17, 2023 г.

Данный подход скорее полезен как демонстрация инструментария, чем действительно реализация редиректа на основной домен. Потому что лучше это делать средствами сервера, а не ПО, чтобы уменьшить нагрузку на сервер. Drupal 8 работает на базе симфонии, ...

Читать
 

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

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



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