web-dev-qa-db-ja.com

Magentoがプログラムで製品画像を削除する

これは非常に単純なプログラミングタスクで、ネット上でそれに関する情報を見つけることは絶対にできません。基本的に、私は商品画像を削除しようとしています。製品のメディアギャラリーからすべての画像を削除したい。このような単純なタスクで何百万行ものコードを無駄にすることなくこれを実行できますか?

私はすでにこれを試したことに注意してください:

$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']);
        }
    }
}

これは絶対に機能しません。インポート中に画像を削除して、重複が発生しないようにしています。どんな助けでも大歓迎です。

22
user439441

さて、これが最終的に私の問題を修正した方法です。

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']);
}

これは最終的に私の頭をまっすぐに設定したリンクです: http://www.magentocommerce.com/wiki/doc/webservices-api/api/catalog_product_attribute_media

$ product-> getImages()ほど簡単ではありませんね。

46
user439441

Magento 1.7.0.2では、次のコードを使用して、製品ギャラリーからすべての画像を削除します。

//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();

Davids Tayの回答からのコードで、次のエラーが発生しました:致命的なエラー:キャッチされない例外 ‘Mage_Eav_Model_Entity_Attribute_Exception’とメッセージ ‘SQLSTATE [23000]:Integrity constraint violation:1452 Ca n't add or update the child row:failed to an foreign key constraint failed(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 外部キー (value_id)リファレンス `catalog_prod) '

9

製品ギャラリーからすべての画像を削除するには:

$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
Pihtt

画像の削除中に、興味深いことが1つ見つかりました。このコードを試すと:

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

メディアギャラリーオブジェクトは、次の場合、製品の作成方法によって異なります。

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

次の場合、メディアギャラリーは空になります。

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

メディアギャラリーはオブジェクトであり、このオブジェクトを使用してデータベースから画像を削除できます。ファイルシステムから画像を削除するには、そのようなコードを追加する必要があります。

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

ただし、画像を変更し、前の画像のように名前を付けたい場合(image1.pngをimage1.pngで置き換える)、この場合、ブラウザーのキャッシュの問題が発生します。

また、製品のメディアギャラリーをロードすることもできます。

$product->getResource()->getAttribute('media_gallery')->getBackend()->afterLoad($product);

これは、このタスクに使用することを最終的に決定したコードです。

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);
}
4
Colin Tickle

あなたが尋ねるようにMagentoプログラミングを介して達成される解決策ではないので、この回答が歓迎されないことはありませんが、Magento 1.4.2.0の関連するテーブルを切り捨てることにより、同じ目的ですべてのギャラリー画像を自分でパージできました(私はそれは1.5でも同じテーブル構造)。

TRUNCATE TABLE `catalog_product_entity_media_gallery`
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`

次に、/ media/catalog/productディレクトリ内のすべての画像ファイルを削除してフォローアップします。

私はこれをプログラムで自分で行う方法を探しましたが、これははるかに効率的であり、悪影響はありませんでした。

3
CVM
     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
Ramesh

これはどうですか

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
Vinay Sikarwar

1000や5000などの製品をさらに削除したい場合は、直接クエリで下の製品を使用します。

これを試す前に、データベースのバックアップを取ってください

<?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
Prashant Barot

画像を削除する最も速い方法は、以下の手順に従います:からすべてのレコードを削除します

  1. catalog_product_entity_media_gallery
  2. catalog_product_entity_media_gallery_value'

magentoはすべての製品画像データをそれらのテーブルに保存するため、テーブル。

次に、セットイメージを黒にするために、管理者のインデックス管理からインデックスを作成します。

次に、画像from dirを削除してから、media/catalog/productのmagentoディレクトリに移動し、このフォルダーからすべてのファイルを削除します。

別のプロセス:

Andy Simpson、システムからis delete all productを実行するスクリプトが必要です。これはdelete from DB and file systemになります。

Step1:a phpを含むroot direct of magento systemMage.php at first codeを作成します。

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

Step2: set current store is adminおよびset Developer mode

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

Step3:Product Collectionを取得し、製品を1つずつ取得するためのループを作成します

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

Step4:製品の画像を1つずつ取得し、以下のコードを使用して画像を1つ削除します。

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

完全なコード:

<?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
Amit Bera

以下のスクリプトをmagentoルートに配置して実行します

 <?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
Bharani K

そのようなことのためにデータベースにアクセスすることは悪い考えです。カスタムモジュールで次のスニペットを使用して、画像を削除する(または 'position'値を変更して画像を並べ替える)ことができます(簡単にするために、ObjectManagerを使用していますが、コンストラクターにProductFactoryとProductRepositoryInterfaceを配置する必要があります)。

$objectManager = ObjectManager::getInstance();

//Get ProductFactory in order to instatiate the Product Object 
$productFactory = $objectManager->get('\Magento\Catalog\Model\ProductFactory');

//We have to use ProductRepositoryInterface in order to save the changes bellow to the product
$productRepository = $objectManager->get('\Magento\Catalog\Api\ProductRepositoryInterface');

//Load a Product by ID in this case 1
$product = $productFactory->create()->load(1);

//Gets an array containing arrays representing each image in the gallery
$mediaGalleryEntries = $product->getMediaGalleryEntries();

//Here we delete every image, you can use conditions in foreach
foreach ($mediaGalleryEntries as $key => $imageEntry) {
    unset($mediaGalleryEntries[$key]);
}

//Finally set the altered entries and save using productRepository
$product->setMediaGalleryEntries($mediaGalleryEntries);
$productRepository->save($product);

上記のコードはMagento 2.3でテストされ、ファイルシステムから画像も削除されます。これを使用して、エントリを削除または変更することができます(位置の変更、イメージの役割など)

各imageEntryを表示するには、$ imageEntry-> getData()を使用してそのデータにアクセスできます

0
sarakinos
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)

なぜ17?

あなたがこのように複製している例:

/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

いいえ、それらは重複しています;)

0
Andrei Balmus

私はそれほど前に似たようなことをしなければなりませんでした-インポート中にすべての製品イメージを置き換える必要がありました。

このリンクは大いに役立ちました: http://www.sharpdotinc.com/mdost/2010/03/02/magento-import-multiple-images-or-remove-images-durring-batch-import/ =

うまくいけば、それはあなたに正しい方向にナッジを与えるでしょう。

0
monkey do