1 сен 2020

Создаем sitemap.xml динамически на 1С-Битрикс

#sitemap, #bitrix, #php, #xml

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

Создаем sitemap.xml динамически на 1С-Битрикс

В битриксе существует два способа создать sitemap: новый - в разделе маркетинг и старый - в модуле поиска. Скажу сразу, новый способ глючный и создает неполную карту, поэтому мы воспользуемся старым API.

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

Чтобы создать sitemap через административный интерфейс битрикса, перейдём в Настройки > Поиск > Google Sitemap. Тут всё просто: проставляем нужные галочки и кликаем "Создать":

Создание sitemap.xml через модуль поиска Битрикса

Битрикс создаст для вас, как минимум, три файла (зависит от количества ссылок): 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 будет создаваться на вашем сайте автоматически и, при желании, вы сможете добавлять в него любые дополнительные ссылки.

Все статьи

© 2020-2021 Александр Пантелеев