Редактирование внутренних модулей CMS Bitrix
Сегодня мы рассмотрим как кастомизировать стандартный модуль генерации Sitemap в Bitrix.
В первую очередь хочу предупредить!!! Кастомизировать внутренние модули Битрикса ПЛОХО! После обновления правки слетят.
Но у нас не было времени. Клиент очень торопил. И пришлось лезть в ядро. В будущем напишем модуль, формирующий sitemap.xml.
Суть вопроса.
Стандартный генератор, в блоке <url></url>
добавляет только два блока - loc
и lastmod
. А требуется чтобы был типа:
<url>
<loc></loc>
<lastmod></lastmod>
<priority></priority>
<changefreq>weekly</changefreq>
</url>
Как заметили, стоит допилить два блока, при чем блок priority
должен формироваться походу в зависимости от условий.
Реализация
Работать будем в папке /bitrix/modules/seo/
.
В первую очередь из этой папки идем в /lib/
Здесь нам понадобятся sitemapfile.php
, sitemapiblock.php
, sitemapindex.php
и sitemapruntime.php
.
Первым делом подредактируем sitemapfile.php
Первое что надо сделать - это заменить 28 строчку:
const ENTRY_TPL = '<url><loc>%s</loc><lastmod>%s</lastmod></url>';
На
const ENTRY_TPL = '<url><loc>%s</loc><lastmod>%s</lastmod><priority>%s</priority><changefreq>weekly</changefreq></url>';
Как видим, это строка с переменными. Кроме changefreq
она всегда постоянна.
Ищем метод addEntry
и в 152 строчке, после этой строчки Converter::getXmlConverter()->encode($entry['XML_LASTMOD'])
добавим следующее:
Converter::getXmlConverter()->encode($entry['XML_PRIORITY'])
Добавляем в массив свойство priority
с ключем XML_PRIORITY
.
Далее в методе appendEntry
ищем Converter::getXmlConverter()->encode($entry['XML_LASTMOD']),
271 строчка и добавляем после нее аналогично вышеописанному
Converter::getXmlConverter()->encode($entry['XML_PRIORITY'])
Потом работаем с методом removeEntry
и добавим после Converter::getXmlConverter()->encode(date('c')),
311 строка добавим Converter::getXmlConverter()->encode('0')
Далее будут аналогичные действия в трех методах addFileEntry
и в двухaddIBlockEntry
.
После 'XML_LASTMOD' => date('c', $f->getModificationTime()),
Добавим элмент массива
'XML_PRIORITY' => $priority,
$prority надо добавить в аргументы метода, кроме addFileEntry
. И навсякий случай сделать условие
В addFileEntry
проверим, если главная страница, то priority 1, а если нет, то 0.7
if($this->getFileUrl($f)=='/'){
$priority = '1';
}else{
$priority = '0.7';
}
А в addIBlockEntry
добавим следующее условие
if(!$priority){
$priority = '0.9';
}
Честно сказать, практика показала, что этих изменений хватило. Выше были указаны файлы, где можно так же внести изменения, они будут в целом аналогичны выше указанным.
И последний штрих. Идем в папку /bitrix/modules/seo/admin
ищем файл seo_sitemap_run.php
Ищем 516 строку и добавляем первое условие:
if($iblockId=='2'){
$priority = '0.8';
}else{
$priority='0.7';
}
Условие означает, что если ID Инфоблока 2 (у нас это каталог) то priority будет 0.8 ,а если нет то 0.7
И меняем:
$sitemapFile->addIBlockEntry($url, $elementLastmod);
на
$sitemapFile->addIBlockEntry($url, $elementLastmod, $priority);
И все! На этом кастомизация завершена. Спасибо за внимание!
Материал подготовлен автором @zheev