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

Комментариев: 1

Если Вам часто приходится работать с товарами в 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 минут или запускайте через консоль.

Уведомлять о новых комментариях
Уведомлять
guest
1 Комментарий
Inline Feedbacks
View all comments
руслан
руслан
4 лет назад

У мну ошибка(
object(mysqli_result)#3 (5) { [“current_field”]=> int(0) [“field_count”]=> int(3) [“lengths”]=> NULL [“num_rows”]=> int(899) [“type”]=> int(0) }