Magento par programmation supprimez des images de produits

cela doit être une tâche de programmation si simple que je ne peux absolument pas trouver d'informations à ce sujet sur le net. En gros, j'essaie de supprimer les images de produit. Je veux supprimer toutes les images de la galerie de médias d'un produit. Puis-je le faire sans parcourir un million de lignes de code pour une tâche aussi simple?

s'il vous Plaît noter que j'ai déjà essayé ceci:

$attributes = $product->getTypeInstance()->getSetAttributes();
if (isset($attributes['media_gallery'])) {
    $gallery = $attributes['media_gallery'];
    $galleryData = $product->getMediaGallery();//this returns NULL

    foreach($galleryData['images'] as $image){
        if ($gallery->getBackend()->getImage($product, $image['file'])) {
            $gallery->getBackend()->removeImage($product, $image['file']);
        }
    }
}

cela ne fonctionne absolument pas. J'essaie de supprimer des images lors d'une importation pour ne pas gardez les doublons accumulés. Toute aide serait grandement appréciée.

21
demandé sur Brian Tompsett - 汤莱恩 2011-04-19 02:10:28

13 réponses

OK, c'est comme ça que j'ai finalement réglé mon problème.

if ($product->getId()){
    $mediaApi = Mage::getModel("catalog/product_attribute_media_api");
    $items = $mediaApi->items($product->getId());
    foreach($items as $item)
        $mediaApi->remove($product->getId(), $item['file']);
}

voici le lien qui a finalement remis ma tête en place: http://www.magentocommerce.com/wiki/doc/webservices-api/api/catalog_product_attribute_media

dommage que ce ne soit pas aussi simple que $product - > getImages (), hein?

45
répondu 2011-04-19 16:26:58

Pour supprimer toutes les images à partir d'un produit de la galerie:

$product = Mage::getModel('catalog/product')->load($id);
$mediaGalleryAttribute = Mage::getModel('catalog/resource_eav_attribute')->loadByCode($entityTypeId, 'media_gallery');
$gallery = $product->getMediaGalleryImages();
foreach ($gallery as $image)
    $mediaGalleryAttribute->getBackend()->removeImage($product, $image->getFile());
$product->save();
8
répondu Pihtt 2011-07-05 07:14:44
//deleting
Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
$mediaApi = Mage::getModel("catalog/product_attribute_media_api");
$items = $mediaApi->items($product->getId());
$attributes = $product->getTypeInstance()->getSetAttributes();
$gallery = $attributes['media_gallery'];
foreach($items as $item){
    if ($gallery->getBackend()->getImage($product, $item['file'])) {
        $gallery->getBackend()->removeImage($product, $item['file']);
    }
}
$product->save();

Avec le code de Davids Tay réponse, j'ai obtenu l'erreur: Erreur fatale: uncaught exception "Mage_Eav_Model_Entity_Attribute_exception’ with message" SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (base_xxx.catalog_product_entity_media_gallery_value, CONSTRAINT FK_CAT_PRD_ENTT_MDA_GLR_VAL_VAL_ID_CAT_PRD_ENTT_MDA_GLR_VAL_ID CLÉ ÉTRANGÈRE ( value_id) REFERENCES `catalog_prod)’

8
répondu Alexander Simonchik 2013-01-08 07:57:18

lors de la suppression des images j'ai trouvé une chose intéressante. Quand vous essayez ce code:

$galleryData = $product->getMediaGallery(); //this returns NULL

galerie des Médias de l'objet dépend de la façon dont votre produit a été créé, si:

$product = Mage::getModel('catalog/product')->loadByAttr('sku', $sku);

alors la galerie des médias sera vide, si:

$product = Mage::getModel('catalog/product')->load($id);

alors media gallery est object et vous pouvez utiliser cet objet pour supprimer des images de db. Pour supprimer des images du système de fichiers, vous devez ajouter un tel code:

@unlink(Mage::getBaseDir('media') . '\catalog\product\' . $image['file']);

mais si vous voulez changer l'image et la nommer comme image précédente (image1.png remplacer par image1.png) dans ce cas, vous devrez problème de mise en cache du navigateur.

vous pouvez Également essayer de charger la galerie multimédia de produit:

$product->getResource()->getAttribute('media_gallery')->getBackend()->afterLoad($product);
5
répondu Viacheslav Kondratiuk 2012-07-19 08:32:34

J'espère que cette réponse n'est pas inopportune, car ce n'est techniquement pas une solution obtenue via la programmation Magento comme vous le demandez, mais j'ai réussi à purger toutes les images de Galerie moi-même pour le même but simplement en tronquant les tables pertinentes dans Magento 1.4.2.0 (je crois que c'est la même structure de table dans 1.5 aussi bien).

TRUNCATE TABLE `catalog_product_entity_media_gallery`
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`

ensuite, supprimez tous les fichiers image dans le / media / catalog / product répertoire.

j'ai chercher un moyen pour faire cela programmatically moi-même, mais a trouvé cela beaucoup plus efficace et n'ont pas éprouvé d'effets secondaires négatifs.

3
répondu CVM 2011-04-18 23:19:02
     Just use this code to create .php file and place it to root folder of magento.

    <?php 
    require_once 'app/Mage.php';

    Mage::app();
    Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);

    $products = Mage::getModel('catalog/product')->getCollection();
      //->addAttributeToFilter('entity_id', array('gt' => 14000));

    $mediaApi = Mage::getModel("catalog/product_attribute_media_api");

    foreach($products as $product) {
        $prodID = $product->getId();
        $_product = Mage::getModel('catalog/product')->load($prodID);
        $items = $mediaApi->items($_product->getId());
        foreach($items as $item) {
            $mediaApi->remove($_product->getId(), $item['file']);
        }
    }
?>
3
répondu Ramesh 2015-09-01 07:38:28

C'est le code que j'ai finalement décidé d'utiliser pour cette tâche.

protected function _removeMediaGalleryImages(Mage_Catalog_Model_Product $product)
{
    $mediaGalleryData = $product->getMediaGallery();
    if (!isset($mediaGalleryData['images']) || !is_array($mediaGalleryData['images'])) {
        return;
    }

    $toDelete = array();
    foreach ($mediaGalleryData['images'] as $image) {
        $toDelete[] = $image['value_id'];
    }
    Mage::getResourceModel('catalog/product_attribute_backend_media')->deleteGallery($toDelete);
}
2
répondu Colin Tickle 2015-07-24 15:33:12

ce

Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
    $mediaApi = Mage::getModel("catalog/product_attribute_media_api");
    $items = $mediaApi->items($product->getId());
    $attributes = $product->getTypeInstance()->getSetAttributes();
    $gallery = $attributes['media_gallery'];
    foreach($items as $item){
        if ($gallery->getBackend()->getImage($product, $item['file'])) {
            $gallery->getBackend()->removeImage($product, $item['file']);
        }
    }
    $product->save();
1
répondu Vinay Sikarwar 2015-03-16 16:32:36

moyen le plus rapide de supprimer l'image,puis suivez les étapes ci-dessous: supprimer tous les enregistrements de

  1. catalog_product_entity_media_gallery
  2. catalog_product_entity_media_gallery_value'

table parce que magento est enregistrer toutes les données d'image du produit à cette table.

puis index à partir de la gestion de L'Index à partir de l'administrateur pour définir l'image noire.

puis supprimer l'image from dir puis allez à votre magento dir à media/catalog/product et à partir de ce dossier supprimer tous les fichiers.

une Autre Processus:

Andy Simpson, vous avez besoin d'un script qui is delete all product de votre système qui va delete from DB and file system.

Etape 1: Créer a phproot direct of magento system dont Mage.php at first code.

require_once "YOURMAGENTODIR/app/Mage.php";
umask(0);

Etape 2: set current store is admin et de définir le mode Développeur

Mage::app('admin');
Mage::setIsDeveloperMode(true);

Step 3: Get Product Collection et de créer une boucle pour obtenir un produit par un par un

$productCollection=Mage::getResourceModel('catalog/product_collection');

Step 4: aller chercher le produit par l'image de l'un et de supprimer une image à l'aide de code ci-dessous:

$remove=Mage::getModel('catalog/product_attribute_media_api')->remove($product->getId(),$eachImge['file']);

CODE COMPLET:

<?php
require_once "YOURMAGENTODIR/app/Mage.php";
umask(0);
Mage::app('admin');
Mage::setIsDeveloperMode(true);

$productCollection=Mage::getResourceModel('catalog/product_collection');
foreach($productCollection as $product){
echo $product->getId();
echo "<br/>";
         $MediaDir=Mage::getConfig()->getOptions()->getMediaDir();
        echo $MediaCatalogDir=$MediaDir .DS . 'catalog' . DS . 'product';
echo "<br/>";

$MediaGallery=Mage::getModel('catalog/product_attribute_media_api')->items($product->getId());
echo "<pre>";
print_r($MediaGallery);
echo "</pre>";

    foreach($MediaGallery as $eachImge){
        $MediaDir=Mage::getConfig()->getOptions()->getMediaDir();
        $MediaCatalogDir=$MediaDir .DS . 'catalog' . DS . 'product';
        $DirImagePath=str_replace("/",DS,$eachImge['file']);
        $DirImagePath=$DirImagePath;
        // remove file from Dir

        $io     = new Varien_Io_File();
         $io->rm($MediaCatalogDir.$DirImagePath);

        $remove=Mage::getModel('catalog/product_attribute_media_api')->remove($product->getId(),$eachImge['file']);
    }


}
1
répondu Amit Bera 2015-11-07 18:35:13

si vous voulez supprimer plus de produits comme 1000 ou 5000 puis utiliser le bas un avec requête directe.

Avant d'essayer celui-ci prendre de sauvegarde de votre base de données

<?php
require_once 'app/Mage.php';
umask(0);
Mage::app();
set_time_limit(0);
ini_set('display_error','1');


$resource = Mage::getSingleton('core/resource');
$connection = $resource->getConnection('core_write');

$id = 101;
$product = Mage::getModel('catalog/product')->load($id);

$q = "DELETE FROM `catalog_product_entity_media_gallery` where entity_id = '".$product->getId()."'"; 

$connection->query($q);

?>
1
répondu Prashant Barot 2016-07-15 13:36:12

j'ai dû faire quelque chose de similaire il n'y a pas si longtemps - nécessaire pour remplacer toutes les images de produit lors d'une importation.

ce lien a beaucoup aidé: http://www.sharpdotinc.com/mdost/2010/03/02/magento-import-multiple-images-or-remove-images-durring-batch-import/

espérons que cela vous donnera un coup de pouce dans la bonne direction.

0
répondu monkey do 2011-07-04 17:42:37
DELETE FROM catalog_product_entity_media_gallery WHERE value_id NOT IN (SELECT * FROM (SELECT MIN(value_id) FROM `catalog_product_entity_media_gallery` GROUP BY LEFT(value,17), entity_id  having count(*) > 1) x)

pourquoi 17 ?

Le expamle vous avez en double comme ceci:

/0/0/000116810609_1.jpg

/0/0/000116810609_2.jpg

/0/0/000116810609_3.jpg

/0/0/000116810609_4.jpg

LEFT(value,17)

/0/0/000116810609

/0/0/000116810609

/0/0/000116810609

/0/0/000116810609

Non, ils sont des doublons ;)

0
répondu Andrew Balmus 2012-12-27 10:59:06

placez le script ci-dessous dans magento root et exécutez

 <?php

  require_once("app/Mage.php");
  umask(0);
   Mage::app();
   $ob = new Clean();
   $ob->removemedia();

 Class Clean {

 function removemedia() {
$read = Mage::getSingleton('core/resource')->getConnection('core_read');
$select = $read->select()
        ->from('catalog_product_entity_media_gallery', '*')
        ->group(array('value_id'));

$flushImages = $read->fetchAll($select);
echo count($flushImages);
$array = array();
foreach ($flushImages as $item1) {
    $array[] = $item1['value'];
}

$valores = $array;

$pepe = 'media' . DS . 'catalog' . DS . 'product';

$leer = $this->listDirectories($pepe);

foreach ($leer as $item) {
    try {
        $item = strtr($item, '\', '/');
        if (!in_array($item, $valores)) {
            $valdir[]['filename'] = $item;
            unlink('media/catalog/product' . $item);
        }
    } catch (Zend_Db_Exception $e) {

    } catch (Exception $e) {
        //Mage::log($e->getMessage());
    }
  }
 }

function listDirectories($path) {
    if (is_dir($path)) {
       if ($dir = opendir($path)) {
        while (($entry = readdir($dir)) !== false) {
            if (preg_match('/^\./', $entry) != 1) {
                if (is_dir($path . DS . $entry) && !in_array($entry, array('cache', 'watermark'))) {
                    $this->listDirectories($path . DS . $entry);
                } elseif (!in_array($entry, array('cache', 'watermark')) && (strpos($entry, '.') != 0)) {
                    $this->result[] = substr($path . DS . $entry, 21);
                }
            }
        }
        closedir($dir);
    }
 }
 return $this->result;
 }

  }
0
répondu Bharani K 2018-02-20 14:03:45