Недавно была такая ситуация, на сайте около 5к страниц (статика+инфоблоки), генерировать внутри битрикса невозможно, т.к. добавляется много ненужных страниц, внешние сервисы сильно нагружают сайт. Сделал скрипт, который собирает все статические страницы, проверяет все активные записи в инфоблоках и выводит ссылки в нужном формате. Рекомендую такой способ.
Фрагмент кода
Код |
---|
<?php
if (!empty($_SERVER['REMOTE_ADDR'])) die('console only');
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__) . '/. ./. ./');
require dirname(__FILE__) . '/. ./modules/main/include/prolog_before.php';
$baseUrl = 'http://***.ru';
$staticUrls = [
'',
'/form/',
'/about/',
'/programs/',
'/price/',
//...
];
$xml = new DomDocument('1.0', 'utf-8');
$urlset = $xml->appendChild($xml->createElement('urlset'));
$urlset->setAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
foreach($staticUrls as $surl) {
if (strpos($surl, '?') !== false) {
$surlfull = $_SERVER['DOCUMENT_ROOT'] . str_replace('?', 'index.php?', $surl);
}
else if(empty($surl)){
$surlfull = $_SERVER['DOCUMENT_ROOT'] . '/index.php';
}
else {
$surlfull = $_SERVER['DOCUMENT_ROOT'] . $surl . 'index.php';
}
$xmlurl = $urlset->appendChild($xml->createElement('url'));
$xmlurl->appendChild($xml->createElement('loc', $baseUrl . $surl));
$xmlurl->appendChild($xml->createElement('lastmod', date('c', filemtime($surlfull))));
}
$sections = [];
$res = CIBlockSection::GetList([], ['IBLOCK_ID' => 12], false, [], false);
while($sec = $res->Fetch()) {
$sections[$sec['ID']] = $sec;
}
//отзывы
$res = CIBlockElement::GetList([], ['IBLOCK_ID' => 13, 'ACTIVE' => 'Y'], false, false, ['ID', 'NAME', 'TIMESTAMP_X']);
while($item = $res->Fetch()) {
$surl = '/about/otzyvy/' . $item['ID'] . '/';
$xmlurl = $urlset->appendChild($xml->createElement('url'));
$xmlurl->appendChild($xml->createElement('loc', $baseUrl . $surl));
$xmlurl->appendChild($xml->createElement('lastmod', date('c', strtotime($item['TIMESTAMP_X']))));
}
//вопросы
$res = CIBlockElement::GetList([], ['IBLOCK_ID' => 16, 'ACTIVE' => 'Y', 'PROPERTY_specc.ACTIVE' => 'Y'], false, false, ['ID', 'NAME', 'TIMESTAMP_X']);
while($item = $res->Fetch()) {
$surl = '/voprosy/' . $item['ID'] . '/';
$xmlurl = $urlset->appendChild($xml->createElement('url'));
$xmlurl->appendChild($xml->createElement('loc', $baseUrl . $surl));
$xmlurl->appendChild($xml->createElement('lastmod', date('c', strtotime($item['TIMESTAMP_X']))));
}
$xml->save('../. ./sitemap.xml'); |