Перейти к содержимому
Все материалы

Sitemap.xml для Payload CMS: автоматическое обновление, hreflang и несколько сайтов

15 октября 2026 г.•Александр Андреев

Создать простой sitemap.xml для небольшого сайта несложно. Но задача заметно усложняется, когда в Payload CMS появляются тысячи материалов, несколько языков или несколько сайтов в одной установке.

Для этих сценариев появился плагин @seshuk/payload-plugin-sitemap. Как и Janitor, он вышел 14 октября 2026 года и распространяется под лицензией MIT.

Репозиторий проекта:

https://github.com/maximseshuk/payload-plugin-sitemap

Плагин автоматически собирает XML Sitemap из документов Payload и обновляет её по мере изменения содержимого.

Откуда берутся страницы

Источником могут быть коллекции Payload.

Например, для сайта с коллекциями pages, posts и products можно сформировать адреса опубликованных страниц на основе документов этих коллекций.

Кроме динамического содержимого можно добавить статические URL и собственные списки адресов — все источники задаются одним массивом sources.

Это позволяет собрать в одной карте как страницы из CMS, так и маршруты приложения, которых в Payload вообще нет.

Черновики при этом исключаются всегда: в коллекциях с версиями и черновиками в карту попадают только опубликованные документы.

Минимальная конфигурация выглядит так:

import { sitemap } from '@seshuk/payload-plugin-sitemap'
import { buildConfig } from 'payload'

export default buildConfig({
  // ...
  jobs: {
    autoRun: [{ cron: '* * * * *', queue: 'default' }],
  },
  plugins: [
    sitemap({
      siteUrl: 'https://example.com',
      sources: [
        { type: 'collection', collection: 'posts', url: '/blog/:slug' },
      ],
    }),
  ],
})

Карта не пересобирается при каждом запросе

Важная особенность реализации — использование Payload Jobs.

При изменении документа плагин ставит в очередь задачу генерации. Карта собирается в фоне и сохраняется в виде готовых файлов. Пользователю или поисковому роботу не приходится ждать, пока приложение при обращении к sitemap.xml заново переберёт тысячи документов.

Похожие изменения схлопываются в одну задачу: по умолчанию после правки плагин выжидает пять минут и собирает всё накопившееся за это время в один прогон.

Состояние генерации можно посмотреть из административной панели — там же есть кнопка Regenerate.

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

Для больших проектов плагин умеет автоматически разбивать карту на несколько файлов: при превышении лимитов спецификации — 50 тысяч URL или 50 МБ на файл — появляется индексный Sitemap и дочерние карты.

Несколько языков

Отдельно предусмотрена локализация.

Если проект использует несколько языков, плагин формирует альтернативные адреса через hreflang.

В результате поисковая система получает информацию о том, что:

/ru/catalog/product
/en/catalog/product

— языковые версии одной страницы. Для каждой из них записываются xhtml:link-альтернейты остальных языков и x-default, указывающий на язык по умолчанию.

Домены для языков тоже можно разделить: siteUrl принимает функцию и может возвращать свой адрес для каждой локали.

Для мультиязычных проектов это удобнее, чем отдельно реализовывать генерацию альтернативных URL поверх стандартного Sitemap.

Несколько сайтов в одном Payload

Ещё интереснее поддержка многосайтовых проектов.

Одна установка Payload может обслуживать несколько сайтов или арендаторов. Для каждого из них плагин формирует отдельную карту — режим включается опцией tenants поверх официального плагина multi-tenant.

Это хорошо сочетается с архитектурой, где одна административная панель используется для управления несколькими доменами.

Вместо одного огромного Sitemap каждый сайт получает собственный набор адресов.

Есть поддержка изображений

В Sitemap можно включать информацию об изображениях страниц.

Это может быть полезно для каталогов, портфолио, сайтов недвижимости и других проектов, где значительную роль играет графический контент.

Плагин берёт необходимые сведения из полей документов — путь к полю может проходить через группы, массивы и блоки — и добавляет их в XML. На одну страницу учитывается до тысячи изображений.

Важный нюанс с Access Control

При генерации карты Payload читает документы от имени анонимного пользователя.

Это означает, что документы, которые невозможно получить публично из-за настроек Access Control, автоматически в Sitemap не попадут.

В большинстве случаев именно такое поведение и требуется: закрытая страница личного кабинета не должна внезапно появиться в карте сайта.

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

Также необходимо настроить выполнение Payload Jobs — без работающего обработчика фоновых заданий автоматическое обновление карты работать не будет.

Установка

Пакет устанавливается через npm:

# Payload 4 beta
pnpm add @seshuk/payload-plugin-sitemap@beta

# Payload 3
pnpm add @seshuk/payload-plugin-sitemap@0

Далее плагин подключается в конфигурации Payload, где указываются домен, коллекции и правила формирования URL.

Поддерживается Payload CMS 3.83 и новее, а для Payload 4 beta доступна отдельная совместимая версия.

Что в итоге

Для сайта из десятка страниц собственный генератор Sitemap вполне можно написать самостоятельно.

Преимущество готового плагина становится заметно на более сложных проектах: много контента, несколько языков, несколько доменов, изображения и регулярное обновление тысяч URL.

В этом случае payload-plugin-sitemap закрывает уже не генерацию одного XML-файла, а весь процесс его поддержки: от получения документов до фонового обновления и публикации готовых карт.

Исходный код открыт, лицензия MIT.

Источники

https://github.com/maximseshuk/payload-plugin-sitemap
Назад в блог
Sitemap.xml для Payload CMS: автоматическое обновление, hreflang и несколько сайтов | Payload по-русски