Здравствуйте.
Про сам функционал хорошо описано тут
Недавно возникла необходимость в фоновом режиме на кроне обновлять файлы sitemap.xml, при этом что бы генерация из админки тоже работала.
Например:
- если вам надо добавить дополнительный файл xml, с чпу урлами страниц результатов умного фильтра
- если у вас чпу элементов строиться посложнее, чем позволяют настройки инфоблоков
- если вам надо управлять датой последней модификации(lastmod) как-то иначе, чем фактическая дата модификации файлов xml.
Может кому пригодиться...
1) копируем себе файл seo_sitemap_run.php из /bitrix/modules/seo/admin/
2) в файле /bitrix/admin/seo_sitemap_run.php подключаем свой скопированный. (да это косяк, но что делать если вам надо что то добавить, если просто автогенерация, то можно не делать этот пункт и другие упростить)
3) в скопированном файле добавляем подключение пролога, например так
Еще там где идет проверка
комментим условие проверки сессии check_bitrix_sessid() ( так проще, не думаю что криминал )
В этом же файле в конце разделаем вывод инфы для прогресс-бара, например так
4) создаем новый файл, например get_sitemap.php, который будет опрашивать ранее скопированный, для пошаговой работы.
В этом файле, после подключения пролога добавляем простой цикл, например:
Код просто как пример, прошу строго не судить.
5) Теперь вешаем файл get_sitemap.php на крон и готово.
Если кто-то знает другой пример как сделать, буду рад увидеть.
Про сам функционал хорошо описано тут
Недавно возникла необходимость в фоновом режиме на кроне обновлять файлы sitemap.xml, при этом что бы генерация из админки тоже работала.
Например:
- если вам надо добавить дополнительный файл xml, с чпу урлами страниц результатов умного фильтра
- если у вас чпу элементов строиться посложнее, чем позволяют настройки инфоблоков
- если вам надо управлять датой последней модификации(lastmod) как-то иначе, чем фактическая дата модификации файлов xml.
Может кому пригодиться...
1) копируем себе файл seo_sitemap_run.php из /bitrix/modules/seo/admin/
2) в файле /bitrix/admin/seo_sitemap_run.php подключаем свой скопированный. (да это косяк, но что делать если вам надо что то добавить, если просто автогенерация, то можно не делать этот пункт и другие упростить)
3) в скопированном файле добавляем подключение пролога, например так
if($_SERVER['SCRIPT_NAME'] == '/bitrix/admin/seo_sitemap_run.php'){
require_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/include/prolog_admin_before.php");
}elseif(
isset($_REQUEST["key"])
&& $_REQUEST["key"] === "#######"
||
isset($argv[1])
&& $argv[1] === "#######"
){
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
}else{
exit();
}
|
$_REQUEST['action'] == 'sitemap_run' |
В этом же файле в конце разделаем вывод инфы для прогресс-бара, например так
if($_SERVER['SCRIPT_NAME'] == '/bitrix/admin/seo_sitemap_run.php'){
echo SitemapRuntime::showProgress($msg, Loc::getMessage('SEO_SITEMAP_RUN_TITLE'), $v);
}
|
В этом файле, после подключения пролога добавляем простой цикл, например:
$pass = '#######';
if(
isset($_GET["key"])
&& $_GET["key"] === $pass
||
isset($argv[1])
&& $argv[1] === $pass
){
$host = COption::GetOptionString("main", "server_name");
$link = 'http://'.$host.'/...../seo_sitemap_run.php';
$schet = 0; //просто счетчик для ограничения
$nextStep = 0;
$ns = '';
$id = 1; //ID выгрузки
while($schet <= 15){
$dataStep = array(
'lang' => 'ru',
'action' => 'sitemap_run',
'ID' => $id,
'value' => $nextStep,
'pid' => $id,
'NS' => $ns,
'key' => $pass
);
$dataStepQuery = http_build_query($dataStep);
$contextStep = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header'=> "Content-type: application/x-www-form-urlencoded",
'content' => $dataStepQuery
),
));
$contStart = file_get_contents($link, false, $contextStep);
if(preg_match('/runSitemap/', $contStart)){
//выбираем данные
preg_match('/runSitemap\(1,\s([0-9]+),/', $contStart, $arNextStep);
if(intval($arNextStep[1]) > 0){
$nextStep = intval($arNextStep[1]);
preg_match('/{(.*)}/', $contStart, $arPregNs);
$ns = '';
if(strlen($arPregNs[0]) > 0 &&
strpos($arPregNs[0], '{') !== false &&
strpos($arPregNs[0], '}') !== false
){
$nsJson = str_replace("'", '"', $arPregNs[0]);
$ns = json_decode($nsJson, true);
}
}
}else{
$schet = 15;
}
$schet++;
}
}
|
5) Теперь вешаем файл get_sitemap.php на крон и готово.
Если кто-то знает другой пример как сделать, буду рад увидеть.