【发布时间】:2012-05-24 22:12:39
【问题描述】:
Magento 中是否有一个管理工具可以删除所有产品中的所有图像?我知道您可以逐个产品地删除所有图像,但我想知道是否有一个管理工具可以一次处理所有产品?
提前致谢。
【问题讨论】:
标签: magento
Magento 中是否有一个管理工具可以删除所有产品中的所有图像?我知道您可以逐个产品地删除所有图像,但我想知道是否有一个管理工具可以一次处理所有产品?
提前致谢。
【问题讨论】:
标签: magento
我不确定您为什么要这样做,但这里有一种方法可以直接从数据库中进行。
备份然后截断这两个表:
catalog_product_entity_media_gallery catalog_product_entity_media_gallery_value
然后删除'/media/catalog/product'
清除所有缓存。
我尚未对其进行测试,但它应该可以完成这项工作。如果它不起作用,则恢复这 2 个表
【讨论】:
dbname.catalog_product_entity_media_gallery_value,CONSTRAINT FK_CATALOG_PRODUCT_MEDIA_GALLERY_VALUE_GALLERY FOREIGN KEY (value_id) REFERENCES dbname.`catalog_pro)
此方法经过测试并且确实有效。您可能想要这样做的一个原因是在您测试产品的数据流导入时。当您在上传中指定图像时,Magento 仅添加图像 - 它不会替换或删除它们。
最终结果是配置文件的多次运行将累积大量多余的图像。
mysql> **truncate catalog_product_entity_media_gallery;**
mysql> **truncate catalog_product_entity_media_gallery_value;**
然后,在 Magento 媒体/目录文件夹的命令提示符下:
media/catalog$ **rm -rf ./product/**
【讨论】:
通过数据库执行此操作是个坏主意,但如果必须:
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 *
【讨论】:
我就是这样解决的:
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";
}
}
【讨论】: