Генерация 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 дабы не разводить бардака.