Генерация sitemap.xml - techart/bitrix.tao GitHub Wiki
Стандартный способ, предоставляемый Битриксом обладает рядом фатальных недостатков, напрочь отметающих любую возможность его использования в нашем случае. Прежде всего - это полная невозможность вмешаться в процесс формирования списка ссылок (убрать что-то или добавить).
Bitrix.TAO предлагает простой механизм, с помощью которого разработчик сам указывает что и как формировать. Работает это так:
\TAO::sitemap()
->protocol('https')
->domain('my.cool.site.com')
->site('s1')
->addNavigation()
->addInfoblockSections('cats')
->addInfoblockElements('cats')
->finish();
В результате исполнения этого кода в корне сайта сформируется файл sitemap.xml, в котором находятся все ссылки из навигации, ссылки на разделы инфоблока cats и ссылки на его элементы. По умолчанию выбираются только активные разделы и элементы.
Разумеется, если ссылки на разделы инфоблока уже входят в навигацию, то не следует упоминать их в sitemap отдельно.
- Если protocol не указан, то будет использоваться http.
- Если site не указан, то будет использоваться сайт по умолчанию.
- Если domain не указан, то будет взят из HTTP_HOST. Поэтому при генерации из CLI домен надо указывать обязательно.
Как добавить не все элементы инфоблока, а по фильтру?
В функцию addInfoblockElements() вторым параметром передается массив того же формата, что и в функцию getRows() инфоблока.
->addInfoblockElements('cats', array(
'filter' => array(
'ACTIVE' => 'Y',
'PROPERTY_INSITEMAP' => 'Y',
)
))
Особенно хитрым предлагается переопределить в инфоблоке функцию sitemapElements() и формировать список ссылок по собственному разумению.
Управление структурой навигации
По умолчанию для источника ссылок в функции addNavigation() используется основная структура полностью (\TAO::navigation()). Но в качестве параметра можно передать какую угодно структуру:
->addNavigation(\TAO::navigation('extra')->filter('in_sitemap'))
Добавление произвольных ссылок
Для этого используется функция addEntry():
->addEntry('/my/cool/page/')
->addEntry('/my/cool/page2/', $timestamp)
Изменение имени файла
\TAO::sitemap('sitemap2.xml')
// ....
->finish();
Как запускать
Конечно же, можно написать контроллер (или просто страницу), где все это и запустить. Но мы хотим генерировать sitemap.xml из CLI-приложение через cron. Поэтому сначала убеждаемся, что настроен CLI-обработчик (см. статью про инсталляцию). Потом создаем файл local/lib/CLI/Sitemap.php:
namespace App\CLI;
class Sitemap extends \TAO\CLI
{
public function sitemap()
{
\TAO::sitemap()
->domain('my.cool.site.com')
->addNavigation()
->addInfoblockSections('cats')
->addInfoblockElements('cats')
->finish();
}
}
и вызываем из командной строки:
php cli.php sitemap
Конечно же, имя класса и имя экшена в нем - произвольны. Но давайте, тем не менее, использовать слово sitemap дабы не разводить бардака.