4

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

提前致谢。

4

4 回答 4

14

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

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

    catalog_product_entity_media_gallery catalog_product_entity_media_gallery_value

  2. 然后删除“/媒体/目录/产品”

  3. 清除所有缓存。

我还没有测试过它,但它应该可以完成这项工作。如果它不起作用,则恢复这 2 个表

于 2012-05-25T13:49:28.103 回答
3

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

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

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

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

media/catalog$ **rm -rf ./product/**
于 2012-12-26T17:40:39.780 回答
2

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

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 *
于 2013-09-01T23:33:00.467 回答
0

这就是我修复它的方式:

    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";
        }
    }
于 2018-05-22T03:37:03.833 回答