Редактирование внутренних модулей 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


Comments 1