Удаление неиспользуемых изображений Virtuemart 2

Если Вам часто приходится работать с товарами в Virtuemart 2, то Вы наверняка знаете, что после удаление товара, само изображение с сайта не удаляется, что в свою очередь зачастую приводит к заполнению дискового пространства сайта ненужными файлами. Лично у меня необходимость удалить ненужные картинки появилась после того, как несколько раз не удачно импортировал товары, потом поменял настройки импорта и изображения размножились, короче не важно, вот Вам скрипт, который позволит удалить эти изображения:

<?php $type = 'product'; $imgPath = $_SERVER['DOCUMENT_ROOT'].'/images/stories/virtuemart/product/'; $resizedPath = $_SERVER['DOCUMENT_ROOT'].'/images/stories/virtuemart/product/resized/'; set_time_limit(0); require $_SERVER['DOCUMENT_ROOT'].'/configuration.php'; $conf = new JConfig; $db = new mysqli($conf->host, $conf->user, $conf->password, $conf->db);

$images = array_slice(scandir($imgPath), 2);
$resized = array_slice(scandir($resizedPath), 2);

$res = $db->query("SELECT 
					virtuemart_media_id, 
					file_url, 
					file_url_thumb 
				   FROM {$conf->dbprefix}virtuemart_medias
				   WHERE virtuemart_media_id IN(SELECT DISTINCT virtuemart_media_id FROM {$conf->dbprefix}virtuemart_{$type}_medias)");
			
var_dump($res); die;
			
while($r = $res->fetch_array()){
	$activeID[] = $r[0];
	
	$p = pathinfo($r[1]);
	$activeImg[] = $p['basename'];
	
	$p = pathinfo($r[2]);
	$activeResized[] = $p['basename'];
}		

$notActiveImg = array_diff($images, $activeImg);
$notActiveResized = array_diff($resized, $activeResized);

$db->query("DELETE FROM {$conf->dbprefix}virtuemart_medias WHERE file_type='$type' AND virtuemart_media_id NOT IN(".implode(',', $activeID).")");
$db->close();

foreach($notActiveImg as $i){
	if(is_file($imgPath.$i) && $i != 'index.html')
		unlink($imgPath.$i);
}
foreach($notActiveResized as $i){
	if(is_file($resizedPath.$i)  && $i != 'index.html')
		unlink($resizedPath.$i);
}

Сразу хочу предупредить, что если изображений много, скрипту понадобится много времени для выполнения. Так, что позаботьтесь об этом,  изменив настройки php, на примерно с 30 секунд до 15 минут 🙂


Комментариев: 15 на Удаление неиспользуемых изображений Virtuemart 2

Добрый день!
Не подскажите для особо одарённых по подробней, как этим пользоваться? куда вставить и как настройки PHP поменять с 30 секунд до 15 минут?

После запуска скрипта:
object(mysqli_result)#3 (5) { [«current_field»]=> int(0) [«field_count»]=> int(3) [«lengths»]=> NULL [«num_rows»]=> int(2390) [«type»]=> int(0) }

Роман добрый ночи. Подскажите как можно воспользоватся даным сариптом но 3м virtuemarte?

Вот такая беда получается :
object(mysqli_result)#3 (0) { }
может я что то неправильно делаю??

Поменял в /libraries/joomla/filter/input.php все как было написано, но к сожалению ничего не изменилось.

Я тут хоть обработку ошибок добавил:
host, $conf->user, $conf->password, $conf->db);

$images = array_slice(scandir($imgPath), 2);
$resized = array_slice(scandir($resizedPath), 2);

$query=»SELECT
virtuemart_media_id,
file_url,
file_url_thumb
FROM {$conf->dbprefix}virtuemart_medias
WHERE virtuemart_media_id IN(SELECT DISTINCT virtuemart_media_id FROM {$conf->dbprefix}virtuemart_{$type}_medias)»;

$res = $db->query($query);

if (!$res) die(«Cannot get database resource!»);

while($r = $res->fetch_array()){
$activeID[] = $r[0];

$p = pathinfo($r[1]);
$activeImg[] = $p[‘basename’];

$p = pathinfo($r[2]);
$activeResized[] = $p[‘basename’];
}
if (!is_null($activeImg)){
$notActiveImg = array_diff($images, $activeImg);
};
if (!is_null($activeResized)){
$notActiveResized = array_diff($resized, $activeResized);
}

if (!is_null($activeID)){
$db->query(«DELETE FROM {$conf->dbprefix}virtuemart_medias WHERE file_type=’$type’ AND virtuemart_media_id NOT IN(«.implode(‘,’, $activeID).»)»);
}
$db->close();

$full=0;
$thumb=0;
if (!is_null($activeImg)){

foreach($notActiveImg as $i){
if(is_file($imgPath.$i) && $i != ‘index.html’){
if (unlink($imgPath.$i)) $full++; else echo «Cannot delete $imgPath$i»;
} else «File not exists $imgPath.$i»;
}
}
if (!is_null($activeResized)){

foreach($notActiveResized as $i){
if(is_file($resizedPath.$i) && $i != ‘index.html’){
if (unlink($resizedPath.$i)) $thumb++; else echo «Cannot delete $imgPath$i»;
} else «File not exists $imgPath.$i»;
}
}
if ($full>0) echo «Deleted $full full-sized images»;
if ($thumb>0) echo «Deleted $thumb thumbnail images»;
if ($full==0 && $thumb==0) echo «Nothing to delete»;
?>

Воспользовалась скриптом — он удалил ВСЕ фото из папки product
(для меня не проблема,есть копии итд), но вроде в заголовке было «не используемые», т.е. не привязанные к товарам, «брошенные»?
Или нет?

Комментировать