Sitemap Pages – мультиязычная карта сайта для модуля Page (Cotonti)

Плагин Sitemap Pages генерирует отдельные XML‑файлы sitemap для каждого языка, указанного в настройках, и опционально один общий индексный файл (sitemap index).


Sitemap Pages – мультиязычная карта сайта для модуля Page (Cotonti)

Плагин Sitemap Pages генерирует отдельные XML‑файлы sitemap для каждого языка, указанного в настройках, и опционально один общий индексный файл (sitemap index). Для языков, отличных от основного, в карту попадают только те категории и страницы, для которых существуют переводы в штатном плагине i18n (таблицы cot_i18n_structure и cot_i18n_pages).


Системные требования и зависимости

  • Cotonti версии 1.0+ (протестировано с PHP 8.5+ и MySQL 8.4).
  • Модуль page – должен быть установлен и активен.
  • Плагин i18n (Content Internationalization) – должен быть установлен и активен. Именно из его таблиц (cot_i18n_structure и cot_i18n_pages) плагин узнаёт, для каких категорий и страниц есть перевод на конкретный язык.
  • Для работы красивых URL требуется настроенный mod_rewrite в Apache (или аналог в Nginx).

Структура плагина

Плагин размещается в папке plugins/sitemap_pages/ и содержит следующие файлы:

sitemap_pages/
├── sitemap_pages.setup.php           # Заголовок, метаданные и настройки плагина
├── sitemap_pages.ajax.php            # Основной обработчик запросов (AJAX)
├── inc/
│   └── sitemap_pages.functions.php   # Функции: генерация карт, работа с URL и языками
├── lang/
│   ├── sitemap_pages.ru.lang.php     # Русские подписи к настройкам
│   └── sitemap_pages.en.lang.php     # Английские подписи к настройкам
├── tpl/
│   ├── sitemap_pages.tpl             # Шаблон для обычного urlset
│   └── sitemap_pages.index.tpl       # Шаблон для индексного файла (sitemapindex)
└── setup/
    └── sitemap_pages.install.php     # Автоматическое добавление ссылки в robots.txt при установке

Шаблоны уже содержат правильную XML-разметку и не требуют ручной правки.


Установка

  1. Скачайте папку sitemap_pages и скопируйте её в директорию plugins/ вашего сайта Cotonti.
  2. Перейдите в админку: Расширения → Плагины.
  3. Найдите в списке Pages Sitemap (multilingual) и нажмите Установить.
  4. При установке плагин автоматически добавит строку Sitemap: https://вашсайт/sitemap-pages.xml в robots.txt (если файл доступен для записи). Старые упоминания sitemap-pages.xml будут удалены, чтобы избежать дублирования.

После установки плагин готов к настройке.


Настройка плагина в админке

Перейдите в Расширения → Плагины → Pages Sitemap (multilingual) → Настройки.

ПараметрЗначение по умолчаниюОписание
Языки (languages)пустоСписок языков через запятую, например: en,ru,ua. Если оставить пустым, используются все активные языки из конфигурации Cotonti (Cot::$cfg['languages']).
Язык по умолчанию (default_lang)uaЯзык, для которого в URL не добавляется префикс (например, /page.php?id=1 вместо /ua/page.php?id=1).
Использовать красивые URL (use_pretty_urls)0 (выключено)Если включено (1), адреса карт будут иметь вид /sitemap-pages.xml и /en/sitemap-pages.xml. Если выключено, используются прямые ссылки с index.php?r=sitemap_pages. Рекомендуется включить после настройки .htaccess.
Включать пагинацию категорий (pageCategoryPagination)1 (включено)Если у категории несколько страниц материалов, в карту будут добавлены URL с параметрами ?d=2, ?d=3 и т.д.
Частота изменения страниц (page_freq)weeklyЗначение тега <changefreq> для страниц.
Приоритет страниц (page_prio)0.5Значение тега <priority> для страниц.
Макс. ссылок на часть карты (perpage)50000Если общее количество URL превышает это число, карта будет разбита на несколько файлов (в большинстве случаев это не требуется).
Время жизни кеша (cache_ttl)3600Период (в секундах), через который кеш карт будет считаться устаревшим и пересоздастся при следующем обращении.

После изменения настроек нажмите Сохранить.


Настройка .htaccess

Для работы красивых URL (если вы включили use_pretty_urls) добавьте в корневой .htaccess следующие строки сразу после правила RewriteRule ^sitemap\.xml$ ...:

RewriteRule ^sitemap-pages\.xml$ index.php?r=sitemap_pages [QSA,L]
RewriteRule ^(en|ru|pl|ua)/sitemap-pages\.xml$ index.php?r=sitemap_pages&l=$1 [QSA,L]

Важно: флаг [QSA] (Query String Append) обязателен, потому что языковое правило Cotonti уже может добавить параметр ?l=en, и без QSA он будет потерян.

Убедитесь, что эти правила расположены до строки # All the rest goes through standard rewrite gateway.


Настройка robots.txt

Плагин при установке автоматически добавляет строку:

Sitemap: https://вашсайт/sitemap-pages.xml

Если автоматическое добавление не сработало (например, файл robots.txt недоступен для записи), добавьте эту строку вручную в конец файла.

Если вы хотите перечислить все языковые карты напрямую, можно добавить:

Sitemap: https://вашсайт/sitemap-pages.xml
Sitemap: https://вашсайт/en/sitemap-pages.xml
Sitemap: https://вашсайт/ru/sitemap-pages.xml
Sitemap: https://вашсайт/pl/sitemap-pages.xml

Однако предпочтительнее использовать индексный файл (см. ниже) и указывать только его.


Проверка в браузере

Сразу после установки и настройки можно открыть следующие адреса (кеш создастся автоматически при первом обращении):

  • Основной язык (ua):
    https://вашсайт/sitemap-pages.xml
  • Английская версия:
    https://вашсайт/en/sitemap-pages.xml
  • Русская версия:
    https://вашсайт/ru/sitemap-pages.xml
  • Польская версия:
    https://вашсайт/pl/sitemap-pages.xml
  • Индексный файл (список всех языков):
    https://вашсайт/index.php?r=sitemap_pages&a=index

Каждая из этих ссылок покажет XML‑документ с URL‑адресами страниц (и категорий, если включена пагинация). Если вы видите пустой <urlset>, проверьте, есть ли для данного языка переведённые страницы в таблице cot_i18n_pages, и включён ли плагин i18n с корректными локалями.


Как отправить в Google Search Console

  1. Войдите в Google Search Console (https://search.google.com/search-console).
  2. Выберите нужный ресурс (сайт).
  3. В левом меню перейдите: Индекс → Файлы Sitemap.
  4. Нажмите Добавить новый файл Sitemap.
  5. Вставьте URL индексного файла:
    https://вашсайт/index.php?r=sitemap_pages&a=index
  6. Нажмите Отправить.

Google прочитает индексный файл и автоматически добавит все языковые подкарты, которые в нём перечислены. Также можно отправить каждую языковую карту отдельно, но это не обязательно.

После отправки проверьте статус — должно появиться «Успешно» и количество обнаруженных страниц.


Кеширование и его очистка

Плагин сохраняет сгенерированные XML‑файлы в папке datas/cache/sitemap_pages/. Внутри вы увидите:

  • ua.xml – карта для языка по умолчанию.
  • en.xml, ru.xml, pl.xml – карты для других языков.
  • *.count – вспомогательные файлы с количеством записей.
  • sitemap_pages_index.xml – индексный файл (если он был запрошен).

Если вы изменили настройки плагина или внесли правки в код, удалите все файлы из этой папки вручную (через FTP или файловый менеджер). При следующем обращении к любой карте кеш пересоздастся автоматически. В повседневной работе очистка не требуется – только при изменениях.


Устранение неполадок

  • Все языковые URL показывают только ua.xml.
    Причина: отсутствует флаг [QSA] в правилах .htaccess (см. раздел 5). Добавьте QSA в обе строки.
  • В URL дублируется языковой префикс (/en/en/page.php?id=1).
    Причина: функция sitemap_pages_url не удаляет уже добавленный префикс. Убедитесь, что в inc/sitemap_pages.functions.php используется правильная версия функции (она очищает путь от известных префиксов).
  • Для некоторых языков пустой файл.
    Значит, в таблице cot_i18n_pages (или cot_i18n_structure) нет записей с соответствующей локалью. Проверьте переводы в плагине i18n.
  • После изменения настроек карта не обновляется.
    Очистите кеш вручную (удалите содержимое datas/cache/sitemap_pages/).
  • Ошибка «XML declaration allowed only at the start of the document» в браузере.
    Убедитесь, что в шаблонах sitemap_pages.tpl и sitemap_pages.index.tpl нет строки <?xml version="1.0" encoding="UTF-8"?>, а сам скрипт начинается с правильной XML-декларации (она добавляется программно). Также проверьте, что в начале файлов нет BOM или лишних пробелов.
  • Google Search Console не принимает карту.
    Убедитесь, что файл соответствует стандарту Sitemap Protocol. Для проверки используйте валидатор XML-карт, например:
    https://www.xml-sitemaps.com/validate-xml-sitemap.html

Дополнительные замечания

  • Шаблон sitemap_pages.index.tpl используется только для страницы с ?a=index и формирует <sitemapindex>. Если вы не планируете использовать индекс, этот шаблон можно не трогать.
  • Плагин полностью независим от старого плагина sitemap. Вы можете продолжать использовать их одновременно для разных модулей.
  • При добавлении нового языка убедитесь, что он присутствует:
    • в настройках плагина (languages);
    • в правилах .htaccess (список (en|ru|pl|ua));
    • в функции удаления префиксов ($knownLangs в sitemap_pages_url).
  • Все вопросы, предложения и сообщения об ошибках можно направлять в поддержку:
    https://abuyfile.com/forums/cotonti/custom/plugs/

Что лучше: один огромный файл или раздельные карты по модулям и языкам?

Прямой ответ: раздельные карты по модулям и языкам — лучше для моего конкретного проекта. Один огромный файл создаёт больше проблем, чем решает.

Вот сравнение по ключевым пунктам.


✅ Преимущества раздельных карт (мой подход)

  1. Производительность генерации
    Каждая карта генерируется только для своего модуля (market / page) и языка. Это быстрее, потребляет меньше памяти и не блокирует сайт. Огромный общий файл пришлось бы пересобирать целиком даже при изменении одной страницы.
  2. Гибкое кеширование
    У каждого модуля свой TTL кеша (Time To Live — это время жизни кеша в секундах). Товары могут обновляться ежедневно, а страницы — раз в неделю. В общем файле такой гибкости нет - там всем нужно с.
  3. Устойчивость к ошибкам
    Если сломается генерация карты товаров, карта страниц продолжит работать. В монолитном файле одна ошибка ломает всё.
  4. Удобство отладки
    Сразу видно, какой модуль/язык вызвал проблему. Логика каждого модуля изолирована.
  5. Соответствие архитектуре Cotonti
    Cotonti модульный — плагины sitemap_market и sitemap_pages независимы, их можно устанавливать и обновлять отдельно. Монолит нарушил бы эту идею.
  6. SEO‑прозрачность
    Поисковики получают чёткую структуру: отдельная карта для товаров, отдельная для страниц, каждая в нескольких языковых версиях. Это упрощает индексацию и анализ покрытия в Search Console.
  7. Обход лимитов
    Google принимает файлы до 50 000 URL и 50 МБ. Разделяя по модулям и языкам, вы избегаете превышения лимита без дополнительного дробления.

❌ Недостатки раздельных карт

  1. Больше записей в robots.txt
    Вместо одной строки Sitemap нужно либо перечислить несколько карт, либо добавить индексный файл (sitemapindex), который ссылается на остальные. Это не проблема, а небольшое усложнение.
  2. Чуть больше запросов от поисковиков
    Вместо одного файла бот загрузит несколько. Но это копеечная нагрузка, и Google нормально обрабатывает множество sitemap‑файлов.

🤔 Что было бы с одним большим файлом

  • Генерация занимала бы в разы больше времени, использовала больше памяти.
  • При каждом обновлении любого модуля пришлось бы пересобирать весь файл целиком.
  • Труднее соблюсти лимит в 50 000 URL — пришлось бы всё равно дробить на части, теряя смысл монолитности.
  • Отладка стала бы сложнее: любая ошибка в одном модуле рушила бы всю карту.

В старом монолитном плагине все модули (market, page, forums, users) собирались в один XML‑файл (или несколько частей, если превышен лимит). При этом:

  • Настройки market_freq, page_freq, forums_freq, users_freq задавали только тег <changefreq> внутри XML – они сообщали поисковику, как часто предположительно меняется контент. Но они не управляли реальной перегенерацией карты.
  • Реальная частота перегенерации определялась единственным параметром cache_ttl для всего плагина. Как только кеш устаревал (с момента последней генерации проходило больше секунд, чем указано в cache_ttl), собирались заново данные всех модулей сразу – даже если товары обновляются каждые 5 минут, а страницы – раз в месяц.

Таким образом, добавление одного нового товара заставляло пересобирать весь гигантский файл: категории и товары market, страницы, форумы, пользователей. Чем больше модулей было включено, тем дольше и ресурсоёмчее была каждая регенерация.

В новом подходе (раздельные плагины) каждый модуль имеет собственный cache_ttl, поэтому:

  • Карта товаров может перегенерироваться каждые 30 минут,
  • Карта страниц – раз в сутки,
  • Карта форумов – раз в неделю.

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

Вывод:

Вывод: текущий подход — раздельные карты по модулям и языкам — оптимален для Cotonti. Он масштабируется, быстрее работает и лучше соответствует модульной архитектуре системы. Один огромный файл выигрывает только в минимализме robots.txt, но это преимущество нивелируется использованием индексного файла (sitemapindex), который вы можете легко включить.


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

Заметка по настройке и работе плагина Sitemap Pages

1. Настройка «Языки» (languages) — нужно ли указывать язык по умолчанию?

Кратко: теперь не обязательно указывать язык по умолчанию в поле languages. функция sitemap_pages_get_languages() в любом случае принудительно добавляет язык по умолчанию (default_lang) в список, если он там отсутствует.

Как работает при разных вариантах заполнения:

  • Поле languages заполнено (например, en,ru,pl)
    Плагин берёт указанные языки и добавляет к ним default_lang (если его нет в списке). В результате в индексе будут все перечисленные языки + язык по умолчанию. Это гарантирует, что основной язык никогда не будет пропущен, даже если администратор забыл его вписать.
  • Поле languages пустое
    Плагин извлекает все активные локали из настройки Cot::$cfg['plugin']['i18n']['locales'] (например, ua, en, ru, pl) и также добавляет default_lang, если его вдруг нет. Таким образом, в индекс попадают все доступные языки сайта без необходимости перечислять их вручную.

Рекомендация:
Если вы хотите, чтобы в карту сайта попали все языки, поддерживаемые плагином i18n, просто оставьте поле languages пустым. Если нужно ограничить набор языков (например, исключить какой-то язык), перечислите нужные коды через запятую — язык по умолчанию будет добавлен автоматически.


2. Как настройки влияют на индексный файл (?r=sitemap_pages&a=index)

Индексный файл формируется строго на основе массива языков, возвращаемого функцией sitemap_pages_get_languages(). Поэтому:

  • При любом варианте настройки (пусто или список) в индексе всегда присутствует язык по умолчанию.
  • Если в поле languages перечислены дополнительные языки, они также попадают в индекс.
  • Если поле пустое, в индекс попадают все локали, зарегистрированные в плагине i18n.

В результате вы получаете полный индекс, где для каждого языка есть отдельная запись <sitemap>, ссылающаяся на соответствующую языковую карту (например, /sitemap-pages.xml для языка по умолчанию и /en/sitemap-pages.xml для английского).


3. Зачем нужен файл по ссылке ?r=sitemap_pages&a=index и что в нём должно быть

Это индексный файл Sitemap Index — стандартный элемент протокола Sitemaps, предназначенный для объединения нескольких карт сайта в одну точку входа.

Назначение:

  • Позволяет отправить в поисковые системы один URL, который автоматически раскрывает все языковые версии карт.
  • Соответствует ограничениям поисковиков (не более 50 000 URL или 50 МБ на один файл) — разделение по языкам снимает эти лимиты.
  • Упрощает управление: при добавлении нового языка не нужно менять robots.txt, достаточно обновить настройки плагина.

Что должно быть в индексе:

  • Корневой элемент <sitemapindex> с правильным namespace.
  • Для каждого активного языка — отдельный блок <sitemap>, содержащий:
    • <loc> — абсолютный URL языковой карты (для основного языка — без префикса, для остальных — с префиксом вида /en/).
    • <lastmod> — дата последней генерации этой карты.
  • Все языки, для которых существует хотя бы одна страница или категория.

Что не должно присутствовать:

  • Элементы <url> (они допустимы только внутри обычных карт, а не в индексе).
  • Пропущенные языки (основной язык должен быть обязательно).
  • Дублирующиеся ссылки на одну и ту же языковую карту.
  • Битые ссылки на несуществующие файлы карт.
  • Языки, для которых нет ни переведённых страниц, ни переведённых категорий (они всё равно могут присутствовать, но тогда карта будет пустой — это допустимо, но не оптимально; лучше исключить их, если не планируется перевод).

Пример корректного индекса для четырёх языков (ua, en, ru, pl):

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://yourproject.com/sitemap-pages.xml</loc>
    <lastmod>2026-08-04T09:02:52+00:00</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://yourproject.com/en/sitemap-pages.xml</loc>
    <lastmod>2026-08-04T09:02:52+00:00</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://yourproject.com/ru/sitemap-pages.xml</loc>
    <lastmod>2026-08-04T09:02:52+00:00</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://yourproject.com/pl/sitemap-pages.xml</loc>
    <lastmod>2026-08-04T09:02:52+00:00</lastmod>
  </sitemap>
</sitemapindex>

Именно этот файл следует отправлять в Google Search Console — он обеспечит индексацию всех языковых версий вашего сайта.

Если нужно создать правило перезаписи для URL-адреса https://yourproject.com/index.php?r=sitemap_pages&a=index индекса карты сайта, чтобы он был красивым:

Добавьте в корневой .htaccess следующее правило сразу после строк

RewriteRule ^sitemap-pages\.xml$ index.php?r=sitemap_pages [QSA,L]
RewriteRule ^(en|ru|pl|ua)/sitemap-pages\.xml$ index.php?r=sitemap_pages&l=$1 [QSA,L]

и перед строкой

# All the rest goes through standard rewrite gateway

вот эту директиву:

RewriteRule ^sitemap-pages-index\.xml$ index.php?r=sitemap_pages&a=index [QSA,L]

После этого индексный файл будет доступен по красивому URL:
https://yourproject.com/sitemap-pages-index.xml

Уже существующее правило для ?r=sitemap_pages&a=index не удаляйте — оно будет работать параллельно. Но для Google Search Console теперь используйте именно https://yourproject.com/sitemap-pages-index.xml.



Rating based on reviews:
Stars received: 0
Total reviews: 0
Average rating: 0
11 minutes read

Reviews to products

No reviews yet


Add to Cart

Product has no downloadable file

 

Category Extentions
SEO and optimization

Content author

webitproff

Online

webitproff

Last logged: 2026-08-04 12:28

  • Чем могу помочь?

    Оказываю весь спектр услуг по CMF Cotonti. Разработка открытых и закрытых корпоративных интернет порталов, небольших социальных сетей, торговые площадки, маркетплейсы, биржи фриланса, каталоги товаров оптовых поставщиков, интернет-магазин под заказ, чтобы делать совместные покупки и групповые совместные продажи от имени нескольких продавцов.

  • Разработки на GitHub бесплатно
    • 2026-08-03 23:04
    • 2026-08-04 12:21

    Market PRO Showcase

    CMS, Script and Engine for an online storefront, infoproduct shop and digital goods store. Different prices in different currencies. Online cryptocurrency payments for goods and services.