Иногда возникает необходимость массово удалить изображения в элементах инфоблока Битрикс — например, при смене дизайна, миграции данных или очистке тестовых данных. Вручную это делать долго, поэтому лучше использовать API.
Важно!
-
Этот скрипт безвозвратно удаляет файлы — восстановить их можно только из резервной копии.
-
Перед запуском обязательно сделайте бэкап базы данных и папки
/upload/. -
Рекомендуется сначала протестировать скрипт на копии сайта.
Скрипт для удаления изображений через API
1. Базовый вариант
Следующий код удаляет все изображения анонса (PREVIEW_PICTURE) и детальные (DETAIL_PICTURE) в указанном инфоблоке:
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
if (CModule::IncludeModule("iblock")) {
$IBLOCK_ID = 1; // ID инфоблока
$arLoadProductArray = [
"PREVIEW_PICTURE" => ['del' => 'Y'],
"DETAIL_PICTURE" => ['del' => 'Y'],
];
$res = CIBlockElement::GetList(
["ID" => "ASC"],
["IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y"],
false,
false,
['ID', 'NAME']
);
while ($arItem = $res->GetNext()) {
$el = new CIBlockElement;
$PRODUCT_ID = $arItem['ID'];
$el->Update($PRODUCT_ID, $arLoadProductArray);
unset($el);
}
echo "Изображения удалены!";
}
?>Как это работает?
-
'del' => 'Y'— флаг, который указывает Битрикс удалить файл. -
CIBlockElement::GetList— получает элементы инфоблока. -
$el->Update()— обновляет элемент, удаляя изображения.
2. Улучшенная версия (с обработкой ошибок и кэша)
Чтобы скрипт был надежнее, добавим:
-
Лимит элементов (чтобы избежать таймаута).
-
Очистку кэша ресайзов (
/upload/resize_cache/iblock). -
Логирование процесса.
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
if (CModule::IncludeModule("iblock")) {
// Настройки
$IBLOCK_ID = 1; // ID инфоблока
$LIMIT = 500; // Ограничение на обработку за один запуск
$CLEAR_CACHE = true; // Очищать кэш ресайзов
$arLoadProductArray = [
"PREVIEW_PICTURE" => ['del' => 'Y'],
"DETAIL_PICTURE" => ['del' => 'Y'],
];
$res = CIBlockElement::GetList(
["ID" => "ASC"],
["IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y"],
false,
["nTopCount" => $LIMIT],
['ID', 'NAME', 'PREVIEW_PICTURE', 'DETAIL_PICTURE']
);
$processed = 0;
$errors = 0;
while ($arItem = $res->GetNext()) {
$el = new CIBlockElement;
$PRODUCT_ID = $arItem['ID'];
echo "Обработка элемента ID: {$arItem['ID']}, NAME: {$arItem['NAME']}<br>";
if ($el->Update($PRODUCT_ID, $arLoadProductArray)) {
$processed++;
echo "Успешно<br>";
} else {
$errors++;
echo "Ошибка: " . $el->LAST_ERROR . "<br>";
}
unset($el);
}
// Очистка кэша ресайзов
if ($CLEAR_CACHE && $processed > 0) {
DeleteDirFilesEx("/upload/resize_cache/iblock");
echo "Кэш ресайзов очищен!<br>";
}
echo "<br><b>Итог:</b><br>";
echo "Обработано: $processed<br>";
echo "Ошибок: $errors<br>";
}
?>Рекомендации и альтернативные подходы
1. Безопасность
-
Защитите скрипт (например, через
.htaccessили HTTP-авторизацию). -
Отключите резервное копирование на время выполнения (если используется автоматический бэкап).
2. Для больших каталогов
-
Разбейте выполнение на части (например, через
nPageSizeиiNumPage). -
Используйте агентов (
CAgent::AddAgent), чтобы избежать таймаута.
3. Восстановление
-
Если что-то пошло не так, восстановите данные из резервной копии.
-
Убедитесь, что бэкап включает не только базу, но и папку
/upload/.
Заключение
Массовое удаление изображений в Битрикс через API — мощный инструмент, но требующий осторожности. Всегда тестируйте скрипт на копии сайта и делайте резервные копии перед запуском.