Автообновляемая карта сайта (sitemap.xml) для Битрикса

12 ноября 2015
В стандартных функциях Битрикса карта сайта создаётся вручную через файлы. Под ручным созданием понимается не написание файла с нуля, а создание карты через нажатие кнопки. Если на сайте поменялись данные, то автоматически файл не обновляется и приходится это делать вручную, нажимая кнопку "Запустить". 


Такие извращения не могут устраивать, поэтому нам нужна автообновляемая карта, которая не будет требовать совершения лишних действий. Для этого в корне сайта создаём файл sitemap.php и помещаем в него нижний код. Готовый файл sitemap.php можно скачать тут.
<?php
//Отключаем статистику Bitrix
define("NO_KEEP_STATISTIC", true);
//Подключаем движок
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
//устанавливаем тип ответа как xml документ
header('Content-Type: application/xml; charset=utf-8');


$array_pages = array();

//Простые текстовые страницы: начало
$array_pages[] = array(
   	'NAME' => 'Главная страница',
   	'URL' => '/',
);
$array_pages[] = array(
   	'NAME' => 'Компания',
   	'URL' => '/kompaniya/',
);
$array_pages[] = array(
   	'NAME' => 'Новости',
   	'URL' => '/novosti/',
);
$array_pages[] = array(
   	'NAME' => 'Услуги',
   	'URL' => '/uslugi/',
);
$array_pages[] = array(
	'NAME' => 'Портфолио',
   	'URL' => '/portfolio/',
);
$array_pages[] = array(
   	'NAME' => 'Отзывы',
   	'URL' => '/otzyvy/',
);
$array_pages[] = array(
   	'NAME' => 'Контакты',
   	'URL' => '/kontakty/',
);
//Простые текстовые страницы: конец


$array_iblocks_id = array('1', '3', '4', '5'); //ID инфоблоков, разделы и элементы которых попадут в карту сайта
if(CModule::IncludeModule("iblock"))
{
	foreach($array_iblocks_id as $iblock_id)
	{
		//Список разделов
		//Список элементов
   		$res = CIBlockSection::GetList(
			array(),
			Array(
				"IBLOCK_ID" => $iblock_id,
				"ACTIVE" => "Y" ,
			),
			false,
			array(
			"ID",
			"NAME",
			"SECTION_PAGE_URL",
		));
		while($ob = $res->GetNext())
   		{
			$array_pages[] = array(
			   	'NAME' => $ob['NAME'],
			   	'URL' => $ob['SECTION_PAGE_URL'],
			);
   		}
		//Список элементов
   		$res = CIBlockElement::GetList(
			array(),
			Array(
				"IBLOCK_ID" => $iblock_id,
				"ACTIVE_DATE" => "Y",
				"ACTIVE" => "Y" ,
			),
			false,
			false,
			array(
			"ID",
			"NAME",
			"DETAIL_PAGE_URL",
		));
   		while($ob = $res->GetNext())
   		{
			$array_pages[] = array(
			   	'NAME' => $ob['NAME'],
			   	'URL' => $ob['DETAIL_PAGE_URL'],
			);
   		}
	}
}

//Создаём XML документ: начало
$xml_content = '';
$site_url = 'http://'.$_SERVER['HTTP_HOST'];
$quantity_elements = 0;
foreach($array_pages as $v)
{
	$quantity_elements++;
	$xml_content.='
   	<url>
		<loc>'.$site_url.$v['URL'].'</loc>
		<priority>1</priority>
	</url>
	';
}
//Создаём XML документ: конец

//Выводим документ
echo '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	'.$xml_content.'
</urlset>
';
?>

Только учтите, что в вашем случае нужно будет указать свои адреса статичных текстовых страниц и ID инфоблоков.

Теперь карта сайта будет доступна по адресу http://test-site.ru/sitemap.php. Путь не очень красивый, т.к файл имеет расширенние PHP, а желательно иметь расширение XML. Не проблема, сделаем перенаправление через файл «.htaccess». Для этого в файл «.htaccess» добавим следующие строки:
<IfModule mod_rewrite.c>
	Options +FollowSymLinks
	RewriteEngine On 
  
	#Доступ карты сайта с sitemap.xml на sitemap.php
	RewriteRule ^sitemap\.xml$ sitemap\.php [L]    
</IfModule>

Готово, теперь карта доступна по двум адресам:
http://test-site.ru/sitemap.php
http://test-site.ru/sitemap.xml