Генерация sitemap для картинок инфоблока
Пример скрипта отрабатывающего на кроне. Простенький скрипт, который достаёт данные о детальной картинке и доп. картинках из свойства типа файл. Сохраняет все это в xml файл, ссылка на который сохраняется в "индексный" xml.
<?php $sapiType = php_sapi_name(); if (substr($sapiType, 0, 3) !== 'cli') { echo 'access denied'; die(); } define("NO_KEEP_STATISTIC", true); define("NOT_CHECK_PERMISSIONS", true); $_SERVER["DOCUMENT_ROOT"] = str_replace('/cron', '', __DIR__); require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php"); $domain = 'https://budagov.ru'; $iblockId = 1; // id инфоблока $addImagesPropId = 13; // id свойства типа файл с доп. картинками $upload_dir = COption::GetOptionString("main", "upload_dir", "upload"); $arFiles = $ids = []; $dbItems = CIBlockElement::GetList( // Достаём все элементы инфоблока и их картинки [], ['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'], false, false, ['ID', 'DETAIL_PICTURE', 'NAME', 'CODE', 'DETAIL_PAGE_URL'] ); while ($arItem = $dbItems->GetNext()) { if ($arItem['DETAIL_PICTURE']) { $ids[$arItem['ID']] = $arFiles[$arItem['DETAIL_PICTURE']] = [ 'URL' => $domain.$arItem['DETAIL_PAGE_URL'], 'NAME' => $arItem['NAME'], 'ID' => $arItem['DETAIL_PICTURE'], ]; } } $dbItems = \Bitrix\Iblock\ElementPropertyTable::getList([ // Достаём доп. картинки 'filter' => ['IBLOCK_ELEMENT_ID' => array_keys($ids), 'IBLOCK_PROPERTY_ID' => $addImagesPropId], 'select' => ['VALUE', 'IBLOCK_ELEMENT_ID'], ]); while ($arItem = $dbItems->fetch()) { if ($arItem['VALUE']) { if (!is_array($arItem['VALUE'])) { $arItem['VALUE'] = [$arItem['VALUE']]; } foreach ($arItem['VALUE'] as $val) { $arFiles[$val] = [ 'URL' => $ids[$arItem['IBLOCK_ELEMENT_ID']]['URL'], 'NAME' => $ids[$arItem['IBLOCK_ELEMENT_ID']]['NAME'], 'ID' => $val, ]; } } } unset($ids); $dbItems = \Bitrix\Main\FileTable::getList([ // Данные о картинках одним запросом 'filter' => ['ID' => array_keys($arFiles)], 'select' => ['ID', 'SUBDIR', 'FILE_NAME'] ]); while ($arItem = $dbItems->fetch()) { $src = "/".$upload_dir."/".$arItem["SUBDIR"]."/".$arItem["FILE_NAME"]; $src = str_replace("//", "/", $src); if (defined("BX_IMG_SERVER")) { $src = BX_IMG_SERVER . $src; } $arFiles[$arItem['ID']]['SRC'] = $src; } // Пишем в xml ob_start(); echo '<?xml version="1.0" encoding="UTF-8"?>'?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"> <?foreach ($arFiles as $arFile) :?> <url> <loc><?=$arFile['URL']?></loc> <image:image> <image:loc><?=$domain.$arFile['SRC']?></image:loc> <image:title><?=$arFile['NAME']?> - Славдом</image:title> </image:image> </url> <?endforeach;?> </urlset> <?php $xml = ob_get_contents(); ob_end_clean(); file_put_contents($_SERVER['DOCUMENT_ROOT'].'/sitemap-images-'.$iblockId.'.xml', $xml); // Добавляем созданный sitemap в список $xmlIndex = simplexml_load_string(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/sitemap-images.xml')); if (!$xmlIndex->sitemap) { $xmlIndex->addChild('sitemap'); $xmlIndex->sitemap->loc = $domain.'/sitemap-images-'.$iblockId.'.xml'; $xmlIndex->sitemap->lastmod = date('c'); } foreach ($xmlIndex->sitemap as $sitemap) { if ($sitemap->loc->__toString() === $domain.'/sitemap-images-'.$iblockId.'.xml') { $sitemap->lastmod = date('c'); } } file_put_contents($_SERVER['DOCUMENT_ROOT'].'/sitemap-images.xml', $xmlIndex->asXML()); echo 'done;'; require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.