Magento中是否有管理工具可以删除所有产品中的所有图片?我知道你可以逐个产品并删除所有图像,但我想知道是否有一个管理工具可以同时处理所有产品?
提前致谢。
答案 0 :(得分:11)
我不确定您为什么要这样做,但这是一种直接从数据库中执行此操作的方法。
备份然后截断这两个表:
catalog_product_entity_media_gallery catalog_product_entity_media_gallery_value
然后删除'/ media / catalog / product'
清除所有缓存。
我没有测试过,但应该做好。如果它不起作用,那么恢复那两个表
答案 1 :(得分:3)
此方法已经过测试并且确实有效。您可能希望这样做的一个原因是您正在测试产品的Dataflow Import。在上传中指定图像时,Magento仅添加图像 - 它不会替换或删除它们。
最终结果是,一些配置文件的运行会积累许多多余的图像。
mysql> **truncate catalog_product_entity_media_gallery;**
mysql> **truncate catalog_product_entity_media_gallery_value;**
然后,从Magento媒体/目录文件夹的命令提示符处:
media/catalog$ **rm -rf ./product/**
答案 2 :(得分: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 *
答案 3 :(得分: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";
}
}