Создаем sitemap.xml динамически на 1С-Битрикс
#sitemap, #bitrix, #php, #xml
В сети очень много инструментов, позволяющих создавать sitemap для сайта. Однако может понадобиться автоматизировать этот процесс, а главное создать механизм, который будет обновлять файл sitemap.xml без участия контент-менеджера или администратора.

В битриксе существует два способа создать sitemap: новый - в разделе маркетинг и старый - в модуле поиска. Скажу сразу, новый способ глючный и создает неполную карту, поэтому мы воспользуемся старым API.
Не стоит забывать, что данные для создания sitemap.xml битрикс берет прямиком из модуля поиска. Поэтому, обязательно произведите переиндексацию поискового индекса, а также проверьте настройки инфоблоков перед тем как запустить процесс.
Чтобы создать sitemap через административный интерфейс битрикса, перейдём в Настройки > Поиск > Google Sitemap. Тут всё просто: проставляем нужные галочки и кликаем "Создать":
Битрикс создаст для вас, как минимум, три файла (зависит от количества ссылок): sitemap_index.xml, sitemap_errors.xml и sitemap_xxx.xml (где xxx порядковый номер файла). Обязательно пропишите в robots.txt директиву Sitemap: [адрес_сайта]/sitemap_index.xml.
Теперь перед нами встают два ключевых вопроса: 1) Как организовать автообновление 2) Как добавить в sitemap ссылки, которые не нашёл битрикс? Оба этих вопроса мы решим одной функцией-агентом. Назовем её reindexSearch():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) { die; } use Bitrix\Main\Loader; function reindexSearch() { // используем api модуля поиска для создания sitemap Loader::includeModule('search'); $NS = []; $maxExecTime = 0; $maxRecords = 5000; $cSiteMap = new \CSiteMap; do { $NS = $cSiteMap->Create("s1", array($maxExecTime, $maxRecords), $NS, ['USE_HTTPS' => 'Y']); // если HTTPS } while (is_array($NS)); // добавим свои урлы в sitemap $path = $_SERVER['DOCUMENT_ROOT'] . "/sitemap_index.xml"; $sitemap = new SimpleXMLElement($path, null, true); // Будем использовать simplexml $sitemapItem = $sitemap->addChild('sitemap'); // добавим элемент sitemap $sitemapItem->addChild('loc', '[протокол][адрес_сайта]/sitemap_embed.xml'); // добавим дополнительный файл sitemap // взято из ядра битрикса - вычисление отклонения от GMT $iTZ = date("Z"); $iTZHour = intval(abs($iTZ) / 3600); $iTZMinutes = intval((abs($iTZ) - $iTZHour * 3600) / 60); $strTZ = ($iTZ < 0? "-": "+").sprintf("%02d:%02d", $iTZHour, $iTZMinutes); // добавляем дату модификации $sitemapItem->addChild('lastmod', date('Y-m-d') . 'T'. date('H:i:s') . $strTZ); // сохраняем файл file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/sitemap_index.xml", $sitemap->asXML(), LOCK_EX); return __METHOD__ . '();'; } |
Не забудьте изменить [протокол][адрес_сайта] на значения, подходящие для вашего сайта, а sitemap_embed.xml (можете назвать как вам нравится) - это дополнительный файл sitemap, куда можно поместить любые ссылки и этим решить вопрос №2. Также следует учитывать, что в 19 строке мы передаем ['USE_HTTPS' => 'Y'] для сайта, использующего протокл https. Если используется http, ничего передавать не надо.
Осталось зарегистрировать фунцкию-агента, созданную выше, которая будет выполняться периодически и обновлять sitemap.xml. Как это сделать в Битриксе можно посмотреть тут.
Теперь файл sitemap будет создаваться на вашем сайте автоматически и, при желании, вы сможете добавлять в него любые дополнительные ссылки.