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

1k
Алексей,
Генерация 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, разработчику, примеры кода, готовый код
Поделиться
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
19 июн 2023
Молодец! Полезная инфа
Пример скрипта отрабатывающего на кроне. Простенький скрипт, который достаёт данные о детальной картинке и доп. картинках из свойства типа файл. Сохраняет все это в xml файл, ссылка на который сохраняется в "индексный" xml.