[Помощь] Virtuemart 2 и пакетное удаление изображений товаров

как бы да индексация фоток товаров по умолчанию закрыта, в ней смысла нет

Для просмотра ссылки Войди или Зарегистрируйся
посмотри в логи в момент ошибки
должно писать что не так
 
Я тут немного поколдовал и предложу немного усовершенствованный скрипт, в нем теперь хоть есть обработка ошибок, в случае если ничего не найдено и вывод количественных результатов в случае успеха.

Также можно переключиться с продуктов на категории, поменяв в первой строке переменную $type.
Инструкция не нужна, как спрашивал товарищ:
Как им пользоваться? Чёт нигде не нашел инструкцию.
Нужно создать php-файл и запихнуть в него скрипт. Запустить через браузер.

И, да, он работает на 3й версии Virtuemart тоже.

PHP:
<?
$type = 'product'; // type of image: "product" or "category"
$imgPath = $_SERVER['DOCUMENT_ROOT']."/images/stories/virtuemart/$type/"; // default path to full-sized images
$resizedPath = $_SERVER['DOCUMENT_ROOT']."/images/stories/virtuemart/$type/resized/"; // default path to thumbnail images
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);

$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<br>";
        } else "File not exists $imgPath.$i<br>";
    }
}
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<br>";
        } else "File not exists $imgPath.$i<br>";
    }
}
if ($full>0) echo "Deleted $full full-sized images<br>";
if ($thumb>0) echo "Deleted $thumb thumbnail images<br>";
if ($full==0 && $thumb==0) echo "Nothing to delete";
?>

Готовый файлик прилагается.
 

Вложения

  • unused.zip
    998 байт · Просмотры: 31
Запускаю данный код
Я тут немного поколдовал и предложу немного усовершенствованный скрипт, в нем теперь хоть есть обработка ошибок, в случае если ничего не найдено и вывод количественных результатов в случае успеха.

Также можно переключиться с продуктов на категории, поменяв в первой строке переменную $type.
Инструкция не нужна, как спрашивал товарищ:

Нужно создать php-файл и запихнуть в него скрипт. Запустить через браузер.

И, да, он работает на 3й версии Virtuemart тоже.

PHP:
<?
$type = 'product'; // type of image: "product" or "category"
$imgPath = $_SERVER['DOCUMENT_ROOT']."/images/stories/virtuemart/$type/"; // default path to full-sized images
$resizedPath = $_SERVER['DOCUMENT_ROOT']."/images/stories/virtuemart/$type/resized/"; // default path to thumbnail images
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);

$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<br>";
        } else "File not exists $imgPath.$i<br>";
    }
}
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<br>";
        } else "File not exists $imgPath.$i<br>";
    }
}
if ($full>0) echo "Deleted $full full-sized images<br>";
if ($thumb>0) echo "Deleted $thumb thumbnail images<br>";
if ($full==0 && $thumb==0) echo "Nothing to delete";
?>

Готовый файлик прилагается.


Запускаю данный код на Virtuemart 2 - удаляет все фото товаров, а не только неиспользуемые.
 
в Excel Like Manager появилась функция удаление не нужных картинок
 
Назад
Сверху