【问题标题】:Magento Admin Tool to remove ALL product imagesMagento 管理工具删除所有产品图像
【发布时间】:2012-05-24 22:12:39
【问题描述】:

Magento 中是否有一个管理工具可以删除所有产品中的所有图像?我知道您可以逐个产品地删除所有图像,但我想知道是否有一个管理工具可以一次处理所有产品?

提前致谢。

【问题讨论】:

    标签: magento


    【解决方案1】:

    我不确定您为什么要这样做,但这里有一种方法可以直接从数据库中进行。

    1. 备份然后截断这两个表:

      catalog_product_entity_media_gallery catalog_product_entity_media_gallery_value

    2. 然后删除'/media/catalog/product'

    3. 清除所有缓存。

    我尚未对其进行测试,但它应该可以完成这项工作。如果它不起作用,则恢复这 2 个表

    【讨论】:

    • 这非常有效,可以防止在开发阶段针对产品构建重复图像。应标记为正确答案。
    • 我在尝试截断表格时不断收到错误消息。 #1701 - 无法截断外键约束中引用的表(dbname.catalog_product_entity_media_gallery_value,CONSTRAINT FK_CATALOG_PRODUCT_MEDIA_GALLERY_VALUE_GALLERY FOREIGN KEY (value_id) REFERENCES dbname.`catalog_pro)
    • 我也收到了外键约束消息。我通过使用“DELETE FROM catalog_product_entity_media_gallery;”删除所有记录来解决它最终得到相同的结果。
    【解决方案2】:

    此方法经过测试并且确实有效。您可能想要这样做的一个原因是在您测试产品的数据流导入时。当您在上传中指定图像时,Magento 仅添加图像 - 它不会替换或删除它们。

    最终结果是配置文件的多次运行将累积大量多余的图像。

    mysql> **truncate catalog_product_entity_media_gallery;**
    mysql> **truncate catalog_product_entity_media_gallery_value;**
    

    然后,在 Magento 媒体/目录文件夹的命令提示符下:

    media/catalog$ **rm -rf ./product/**
    

    【讨论】:

    • 这对我有用,虽然我更喜欢 cd 进入目录本身 media/catalog/product/ 然后 rm -rf 从里面,只是为了我自己的理智
    【解决方案3】:

    通过数据库执行此操作是个坏主意,但如果必须:

    ALTER TABLE `catalog_product_entity_media_gallery_value` 
     DROP FOREIGN KEY `FK_CAT_PRD_ENTT_MDA_GLR_VAL_STORE_ID_CORE_STORE_STORE_ID`,
     DROP FOREIGN KEY `FK_CAT_PRD_ENTT_MDA_GLR_VAL_VAL_ID_CAT_PRD_ENTT_MDA_GLR_VAL_ID`;
    
    TRUNCATE `catalog_product_entity_media_gallery_value`;
    TRUNCATE `catalog_product_entity_media_gallery`;
    
    ALTER TABLE `catalog_product_entity_media_gallery_value` 
     ADD CONSTRAINT `FK_CAT_PRD_ENTT_MDA_GLR_VAL_STORE_ID_CORE_STORE_STORE_ID` FOREIGN KEY (`store_id`) REFERENCES `core_store` (`store_id`) ON DELETE CASCADE ON UPDATE CASCADE,
     ADD CONSTRAINT `FK_CAT_PRD_ENTT_MDA_GLR_VAL_VAL_ID_CAT_PRD_ENTT_MDA_GLR_VAL_ID` FOREIGN KEY (`value_id`) REFERENCES `catalog_product_entity_media_gallery` (`value_id`) ON DELETE CASCADE ON UPDATE CASCADE;
    

    然后您可以使用以下命令删除产品文件夹:

    cd media/catalog/product
    rm -rf *
    

    【讨论】:

      【解决方案4】:

      我就是这样解决的:

          public function __construct(
              \Magento\Catalog\Model\Product $product,
              \Magento\Framework\App\ResourceConnection $resource,
              \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
              \Magento\Catalog\Model\Product\Gallery\Processor $processor
          ) {
              $this->productRepository = $productRepository;
              $this->product = $product;
              $this->resource = $resource;
              $this->processor = $processor;
          }
      
          protected function removeImageGallery($product)
          {
              try {
                  $gallery = $this->resource->getTableName('catalog_product_entity_media_gallery');
                  $galleryValue = $this->resource->getTableName('catalog_product_entity_media_gallery_value');
      
                  $sql = <<<EOT
      DELETE FROM {$gallery}
      WHERE value_id IN (SELECT value_id FROM {$galleryValue} WHERE entity_id = {$product->getId()})
      EOT;
      
                  $response = $this->resource->getConnection()->query($sql);
      
                  echo '(' . $product->getTypeId() . '): ' . $product->getSku() . " - No. Images: " . $response->rowCount() .  "\n";
      
      
      //            // Or if you want to try the Magento way
      //
      //            $images = $product->getMediaGalleryImages();
      //            foreach($images as $child){
      //                echo '(' . $product->getTypeId() . '): ' . $product->getSku() . ' - ' . $child->getFile() . "\n";
      //                $this->processor->removeImage($product, $child->getFile());
      //            }
      //
      //            $this->productRepository->save($product);
      
              } catch (\Exception $e) {
                  echo $e->getMessage() . "\n";
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 1970-01-01
        相关资源
        最近更新 更多