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-разметку и не требуют ручной правки.
Установка
- Скачайте папку
sitemap_pagesи скопируйте её в директориюplugins/вашего сайта Cotonti. - Перейдите в админку: Расширения → Плагины.
- Найдите в списке
Pages Sitemap (multilingual)и нажмите Установить. - При установке плагин автоматически добавит строку
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
- Войдите в Google Search Console (https://search.google.com/search-console).
- Выберите нужный ресурс (сайт).
- В левом меню перейдите: Индекс → Файлы Sitemap.
- Нажмите Добавить новый файл Sitemap.
- Вставьте URL индексного файла:
https://вашсайт/index.php?r=sitemap_pages&a=index - Нажмите Отправить.
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/
Что лучше: один огромный файл или раздельные карты по модулям и языкам?
Прямой ответ: раздельные карты по модулям и языкам — лучше для моего конкретного проекта. Один огромный файл создаёт больше проблем, чем решает.
Вот сравнение по ключевым пунктам.
✅ Преимущества раздельных карт (мой подход)
- Производительность генерации
Каждая карта генерируется только для своего модуля (market / page) и языка. Это быстрее, потребляет меньше памяти и не блокирует сайт. Огромный общий файл пришлось бы пересобирать целиком даже при изменении одной страницы. - Гибкое кеширование
У каждого модуля свой TTL кеша (Time To Live — это время жизни кеша в секундах). Товары могут обновляться ежедневно, а страницы — раз в неделю. В общем файле такой гибкости нет - там всем нужно с. - Устойчивость к ошибкам
Если сломается генерация карты товаров, карта страниц продолжит работать. В монолитном файле одна ошибка ломает всё. - Удобство отладки
Сразу видно, какой модуль/язык вызвал проблему. Логика каждого модуля изолирована. - Соответствие архитектуре Cotonti
Cotonti модульный — плагиныsitemap_marketиsitemap_pagesнезависимы, их можно устанавливать и обновлять отдельно. Монолит нарушил бы эту идею. - SEO‑прозрачность
Поисковики получают чёткую структуру: отдельная карта для товаров, отдельная для страниц, каждая в нескольких языковых версиях. Это упрощает индексацию и анализ покрытия в Search Console. - Обход лимитов
Google принимает файлы до 50 000 URL и 50 МБ. Разделяя по модулям и языкам, вы избегаете превышения лимита без дополнительного дробления.
❌ Недостатки раздельных карт
- Больше записей в robots.txt
Вместо одной строкиSitemapнужно либо перечислить несколько карт, либо добавить индексный файл (sitemapindex), который ссылается на остальные. Это не проблема, а небольшое усложнение. - Чуть больше запросов от поисковиков
Вместо одного файла бот загрузит несколько. Но это копеечная нагрузка, и 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.
Product has no downloadable file
- Category Extentions
- SEO and optimization
Content author
Online
webitproff
Last logged: 2026-08-04 12:28
Чем могу помочь?
Оказываю весь спектр услуг по CMF Cotonti. Разработка открытых и закрытых корпоративных интернет порталов, небольших социальных сетей, торговые площадки, маркетплейсы, биржи фриланса, каталоги товаров оптовых поставщиков, интернет-магазин под заказ, чтобы делать совместные покупки и групповые совместные продажи от имени нескольких продавцов.
Разработки на GitHub бесплатно
Telegram
- 2026-08-03 23:04
- 2026-08-04 12:21
Related and similar products
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.