Неочевидные нюансы настройки sitemap.xml

Неочевидные нюансы настройки sitemap.xml

В битриксе простые и удобные настройки генератора карты сайта.

На закладке Файлы отмечаете статические страницы сайта, которые должны быть проиндексированы. Для них будет создан отдельный файл, который подключается к sitemap.xml. Имя этого файла задается в поле "Имя файла карты сайта с данными о файлах:", по-умолчанию sitemap_files.php

На закладке Инфоблоки отмечаем разделы и элементы инфоблоков, которые хотим проиндексировать.
Для каждого инфоблока будем создан отдельный файл с названием sitemap-iblock-#IBLOCK_ID#.xml. То есть будут файлы sitemap-iblock-1.xml, sitemap-iblock-2.xml и т.д. Но удобнее использовать код инфоблока и сделать такие названия файлов: sitemap-blog.xml, sitemap-catalog.xml.

Шаблон названия можно поменять в поле "Шаблон имени файла карты сайта с данными инфоблоков".  Меняем sitemap-iblock_#IBLOCK_ID#.xml  на sitemap-#IBLOCK_CODE#.xml

А нет, не тут-то было - битрикс исправляет "_" на "-"!
Ошибка шаблона названия файла инфоблока для карты сайта
И даже если попытаться обратно написать IBLOCK_ID, все-равно исправляет. Но это исправимо: IBLOCK_ID надо не печатать, а просто вставить, copy/paste.
Но с IBLOCK_CODE такое не получится, поменяется на IBLOCK-CODE.

Эта проблема актуальна для версии модуля seo 24.0.0. Уверена, что битрикс ее рано или поздно исправит. 
А что делать сейчас? Можно оставить по-умолчанию, а потом переименовать файлы и ссылки на них. Но это подойдет, если карта создается только вручную и не включена автогенерация.

Лайфхак: все, что нам надо - это один раз сохранить нужный шаблон названия, потому что исправляется он только в момент изменения поля.
Отвечает за это javascript-функция onPathInput из файла /bitrix/modules/seo/admin/seo_sitemap_edit.php
Там есть такая строка
const valueForSearch = input.value.replaceAll(/#IBLOCK_ID#|#FORUM_ID#/g,'');
Все, кроме #IBLOCK_ID# и #FORUM_ID#, проверяется на "_". 
В ядро мы, конечно, не полезем. Но мы можем функцию переопределить.
onPathInput= function(input){
//сюда копируем код исходной функции и добавляем #IBLOCK_CODE# по аналогии с #IBLOCK_ID#
}

Подключаем функцию в init.php через обработчик OnEpilog. А лучше создать отдельный файл, который уже и подключать в init.php, тем более, что он нужен будет только единожды - подключили, сделали настройки, отключили - больше этот код не нужен.
<?php
\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnEpilog", "MyOnAfterEpilog");
function MyOnAfterEpilog()
{
   global $USER; 
   //добавляем только для администраторов на странице редактирования настроек sitemap
   if ($USER->IsAdmin() && $_SERVER["SCRIPT_NAME"]=='/bitrix/admin/seo_sitemap_edit.php'){
  ?><script type="text/javascript">
    onPathInput= function(input){
const valueForSearch = input.value.replaceAll(/#IBLOCK_ID#|#IBLOCK_CODE#|#FORUM_ID#/g,'');
if (valueForSearch.indexOf('_') !== -1)
{
const caret = input.selectionStart;
input.value = input.value.replace('_', '-');
input.value = input.value.replace('#IBLOCK-ID#', '#IBLOCK_ID#');
input.value = input.value.replace('#IBLOCK-CODE#', '#IBLOCK_CODE#');
input.value = input.value.replace('#FORUM-ID#', '#FORUM_ID#');

if (input.setSelectionRange)
{
input.focus();
input.setSelectionRange(caret, caret);
}

BX.Runtime.loadExtension('ui.notification')
.then(res => {
BX.UI.Notification.Center.notify({
content: ''
});
});
}
}
</script><?
   }
}

#лайфхакиБитрикс #админка_битрикс


06.08.2024

Возврат к списку