Sitemap Pages – мультиязычная карта сайта для модуля Page (Cotonti)
Плагин Sitemap Pages генерирует отдельные XML‑файлы sitemap для каждого языка, указанного в настройках, и опционально один общий индексный файл (sitemap index).
- Категория расширения
- SEO и оптимизация
- Доступность
- Бесплатно
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.
вот пример как сделано у меня:
################ Cotonti Handy URLs for Apache #######################
# Below are the rules to be included in your main .htaccess file or httpd.conf
# Rewrite engine options
Options -Indexes
RewriteEngine On
RewriteBase "/"
# Language selector
RewriteRule ^(ru|en)/(.*) $2?l=$1 [QSA,NC,NE,DPI]
# Sitemap shortcut
# RewriteRule ^sitemap\.xml$ index.php?r=sitemap [L]
# ==========================================================
# Sitemap Pages – multilingual sitemap for the Page module (Cotonti)
# https://github.com/webitproff/sitemap-pages-xml-i18n-cotonti
# ==========================================================
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]
RewriteRule ^sitemap-pages-index\.xml$ index.php?r=sitemap_pages&a=index [QSA,L]
# ==========================================================
# Sitemap Market – multilingual sitemap for the Market module (Cotonti)
# https://github.com/webitproff/sitemap-market-xml-i18n-cotonti
# ==========================================================
RewriteRule ^sitemap-market\.xml$ index.php?r=sitemap_market [QSA,L]
RewriteRule ^(en|ru|pl|ua)/sitemap-market\.xml$ index.php?r=sitemap_market&l=$1 [QSA,L]
RewriteRule ^sitemap-market-index\.xml$ index.php?r=sitemap_market&a=index [QSA,L]
# Admin area and message are special scripts
RewriteRule ^admin/([a-z0-9]+) admin.php?m=$1 [QSA,NC,NE,L]
RewriteRule ^(admin|login|message)(/|\?|$) $1.php [QSA,NC,NE,L]
# users
RewriteRule ^customers/?$ index.php?e=users&group=customer [QSA,NC,NE,L]
RewriteRule ^contractors/?$ index.php?e=users&group=contractor [QSA,NC,NE,L]
RewriteRule ^customers/([a-zA-Z0-9_./%-]+)/?$ index.php?e=users&group=customer&cat=$1 [QSA,NC,NE,L]
RewriteRule ^contractors/([a-zA-Z0-9_./%-]+)/?$ index.php?e=users&group=contractor&cat=$1 [QSA,NC,NE,L]
# forums
RewriteRule ^forums/([a-zA-Z0-9_./%-]+)/topic([0-9]+)/page([0-9]+)?$ index.php?e=forums&m=posts&q=$2&d=$3 [QSA,NC,NE,L]
RewriteRule ^forums/([a-zA-Z0-9_./%-]+)/topic([0-9]+)?$ index.php?e=forums&m=posts&q=$2 [QSA,NC,NE,L]
RewriteRule ^forums/([a-zA-Z0-9_./%-]+)/post([0-9]+)?$ index.php?e=forums&m=posts&id=$2 [QSA,NC,NE,L]
RewriteRule ^forums/([a-zA-Z0-9_./%-]+)/([a-zA-Z0-9_%-]+)/page([0-9]+)?$ index.php?e=forums&m=topics&s=$2&d=$3 [QSA,NC,NE,L]
RewriteRule ^forums/([a-zA-Z0-9_./%-]+)/([a-zA-Z0-9_%-]+)/?$ index.php?e=forums&m=topics&s=$2 [QSA,NC,NE,L]
RewriteRule ^forums/([a-zA-Z0-9_%-]+)/?$ index.php?e=forums&c=$1 [QSA,NC,NE,L]
RewriteRule ^forums/?$ index.php?e=forums [QSA,NC,NE,L]
# System category has priority over /system folder
RewriteRule ^system/?$ index.php?rwr=system [QSA,NC,NE,L]
# All the rest goes through standard rewrite gateway
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]+) index.php?rwr=$1 [QSA,NC,NE,L]
Настройка robots.txt
Плагин при установке автоматически добавляет строку:
Sitemap: https://вашсайт/sitemap-pages.xml
Если автоматическое добавление не сработало (например, файл robots.txt недоступен для записи), добавьте эту строку вручную в конец файла.
Если вы хотите перечислить все языковые карты напрямую, можно добавить или модифицировать по моему примеру ниже:
Host: https://abuyfile.com
# base plug sitemap must be commented
# Sitemap: https://abuyfile.com/index.php?r=sitemap&a=index
# Sitemap: https://abuyfile.com/sitemap.xml
# ==========================================================
# Sitemap Pages – multilingual sitemap for the Page module (Cotonti)
# https://github.com/webitproff/sitemap-pages-xml-i18n-cotonti
# ==========================================================
Sitemap: https://abuyfile.com/sitemap-pages-index.xml
Sitemap: https://abuyfile.com/index.php?r=sitemap_pages&a=index
Sitemap: https://abuyfile.com/sitemap-pages.xml
Sitemap: https://abuyfile.com/en/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.
Онлайн
webitproff
Последняя авторизация: 18.09.2026 13:41
- Дата размещения 03.08.2026 23:04
- Обновлено 13.09.2026 14:17
Обсуждение страницы в Telegram
Витрина Market PRO
CMS, Скрипт и Движок - веб сайта онлайн-витрины, интернет магазина инфопродуктов и цифровых товаров. Разные цены в разных валютах на товар. Онлайн-оплата в криптовалюте за товары и услуги.