Генерация sitemap для картинок инфоблока

69
Алексей,
Генерация sitemap для картинок инфоблока
Генерация sitemap для картинок инфоблока

Пример скрипта отрабатывающего на кроне. Простенький скрипт, который достаёт данные о детальной картинке и доп. картинках из свойства типа файл. Сохраняет все это в xml файл, ссылка на который сохраняется в "индексный" xml.

Пример скрипта отрабатывающего на кроне. Простенький скрипт, который достаёт данные о детальной картинке и доп. картинках из свойства типа файл. Сохраняет все это в 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");

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 17 апреля 2023 | Обновлено 18 апреля 2023
seo, sitemap, разработчику, примеры кода, готовый код
Поделиться
Комментарии
Авторизуйтесь чтобы получать уведомления об ответе
Пример скрипта отрабатывающего на кроне. Простенький скрипт, который достаёт данные о детальной картинке и доп. картинках из свойства типа файл. Сохраняет все это в xml файл, ссылка на который сохраняется в "индексный" xml.