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']);
}
}
}
这绝对行不通。我试图在导入过程中删除图像,这样我就不会不断产生重复项。任何帮助将不胜感激。
This must be a such a simple programming task that I absolutely cannot find any information about it on the net. Basically, I'm trying to DELETE product images. I want to delete all images from a product's media gallery. Can I do this without wading through a million lines of code for such a simple task?
Please note that I've already tried this:
$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']);
}
}
}
This absolutely does not work. I'm trying to delete images during an import so that I do not keep accruing duplicates. Any help would be greatly appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
在 Magento 1.7.0.2 中,我使用此代码从产品库中删除所有图像:
使用 Davids Tay 答案中的代码,我收到错误:
致命错误:未捕获异常“Mage_Eav_Model_Entity_Attribute_Exception”,消息为“SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行:外键约束失败(
base_xxx
。catalog_product_entity_media_gallery_value,约束
FK_CAT_PRD_ENTT_MDA_GLR_VAL_VAL_ID_CAT_PRD_ENTT_MDA_GLR_VAL_ID
外键(value_id
)引用 `catalog_prod)'In Magento 1.7.0.2 I use this code for remove all images from a product gallery:
With code from Davids Tay answer, I got the error:
Fatal error: Uncaught exception ‘Mage_Eav_Model_Entity_Attribute_Exception’ with message ‘SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (
base_xxx
.catalog_product_entity_media_gallery_value
, CONSTRAINTFK_CAT_PRD_ENTT_MDA_GLR_VAL_VAL_ID_CAT_PRD_ENTT_MDA_GLR_VAL_ID
FOREIGN KEY (value_id
) REFERENCES `catalog_prod)’要从产品库中删除所有图像:
To remove all images from a product gallery:
在删除图像的过程中我发现了一件有趣的事情。当您尝试此代码时:
媒体库对象取决于您的产品的创建方式,如果:
则媒体库将为空,如果:
则媒体库是对象,您可以使用此对象从数据库中删除图像。
要从文件系统中删除图像,您必须添加这样的代码:
但如果您想更改图像并将其命名为以前的图像(image1.png 替换为 image1.png),在这种情况下,您将遇到浏览器缓存问题。
您也可以尝试加载产品的媒体库:
During deleting of images I found one interesting thing. When you try this code:
Media gallery object depends on how your product was created, if:
then media gallery will be empty, if:
then media gallery is object and you can use this object to delete images from db.
To delete images from file system you have to add such code:
but if you want to change image and name it like previous image (image1.png replace with image1.png) in this case you will have browser caching issue.
Also you can try to load media gallery for product:
这是我最终决定用于此任务的代码。
This is the code I finally decided to use for this task.
希望这个答案不会不受欢迎,因为从技术上讲,它不是通过 Magento 编程实现的解决方案,正如您所要求的,但我已经成功地自己清除了所有画廊图像以达到相同的目的,只需截断 Magento 1.4.2.0 中的相关表(我相信它是1.5 中的表结构也相同)。
然后删除 /media/catalog/product 目录中的所有图像文件。
我确实自己寻找一种以编程方式执行此操作的方法,但发现这种方法效率更高,并且没有经历任何负面副作用。
Hopefully this answer isn't unwelcome, as it's technically not a solution achieved via Magento programming as you ask, but I have successfully purged all gallery images myself for the same purpose simply by truncating the relevant tables in Magento 1.4.2.0 (I believe it's the same table structure in 1.5 as well).
Then follow up by removing all the image files within the /media/catalog/product directory.
I did look for a way to do this programmatically myself, but found this much more efficient and have experienced no negative side effects.
这又怎么样
What About this
删除图像的最快方法,然后按照以下步骤操作:
表中的所有记录
catalog_product_entity_media_gallery
catalog_product_entity_media_gallery_value'
,因为 magento 将所有产品图像数据保存在这些表中。
然后从管理员的索引管理中进行索引,将图像设置为黑色。
然后从目录中删除图像,然后转到位于
media/catalog/product
的 magento 目录,并从此文件夹中删除所有文件。另一个过程:
Andy Simpson,您需要一个脚本,用于从系统中
删除所有产品
,从而从数据库和文件系统中删除
。第1步:在
magento系统的根目录
处创建一个php
,其中在第一个代码处包含Mage.php
。Step2: 设置
当前商店为
admin 并设置开发者模式Step3: 获取
Product Collection
并为获取创建一个循环一个接一个的产品第四步:逐一获取产品图像并使用以下代码删除图像:
完整代码:
Fastest way to remove image,then follow below steps:
delete all records from
catalog_product_entity_media_gallery
catalog_product_entity_media_gallery_value'
table because magento is save all product image data at those table.
Then index from Index management from admin for set image black.
Then remove image
from dir
then goto Your magento dir atmedia/catalog/product
and from this folder delete all file.Another Process:
Andy Simpson,you need a script which
is delete all product
from your system which willdelete from DB and file system
.Step1: Create
a php
atroot direct of magento system
which includeMage.php at first code
.Step2: set
current store is
admin and set Developer modeStep3: Get
Product Collection
and create a loop for get one product by one by oneStep4: fetch product image by one and remove image one using below code:
FULL CODE:
如果您想删除更多产品(例如 1000 或 5000 个),请使用直接查询的底部一项。
在尝试此操作之前,请先备份您的数据库
If you want to remove more products like 1000 or 5000 then use bottom one with direct query.
Before try this one take backup of your database
访问数据库进行此类操作是一个坏主意。
您可以在自定义模块中使用以下代码片段删除图像(或通过更改“位置”值重新排序它们)(为了简单起见,我使用 ObjectManager,但您应该将 ProductFactory 和 ProductRepositoryInterface 放在构造函数中)
上面的代码在 Magento 2.3 中进行了测试,它还会从文件系统中删除图像。您可以使用它来删除或更改条目(更改位置、图像角色等)
要查看每个 imageEntry,您可以使用 $imageEntry->getData() 访问其数据
Accessing the Database for such things is a bad idea.
You can delete images ( or reorder them by changing the 'position' value ) using the following snippet in a custom module ( for the sake of simplicity i'm using ObjectManager, but you should place ProductFactory and ProductRepositoryInterface in the constructor )
The code above tested in Magento 2.3 and it also removes images from the filesystem. You can use it to either delete or alter an entry ( change position, image roles etc )
To view each imageEntry you can access its data using $imageEntry->getData()
不久前我不得不做类似的事情 - 需要在导入过程中替换所有产品图像。
此链接有很大帮助:http://www.sharpdotinc.com/mdost/2010/03/02/magento-import-multiple-images-or-remove-images-durring-batch-import/
希望它会给你一个正确的方向推动。
I had to do something similar not too long ago - needed to replace all product images during an import.
This link helped a lot: http://www.sharpdotinc.com/mdost/2010/03/02/magento-import-multiple-images-or-remove-images-durring-batch-import/
Hopefully it will give you a nudge in the right direction.
为什么是17?
您重复的例子如下:
/0/0/000116810609_1.jpg
/0/0/000116810609_2.jpg
/0/0/000116810609_3.jpg
/0/0/000116810609_4.jpg
/0/0/000116810609
/0/0 /000116810609
/0/0/000116810609
/0/0/000116810609
不,它们是重复的;)
why 17 ?
The expamle you have duplicate like this:
/0/0/000116810609_1.jpg
/0/0/000116810609_2.jpg
/0/0/000116810609_3.jpg
/0/0/000116810609_4.jpg
/0/0/000116810609
/0/0/000116810609
/0/0/000116810609
/0/0/000116810609
No they are duplicates ;)
将以下脚本放入magento根目录并执行
Place the below script in magento root and execute
好吧,这就是我最终解决问题的方法。
这是最终让我头脑清醒的链接: http://www.magentocommerce.com magentocommerce.com/wiki/doc/webservices-api/api/catalog_product_attribute_media
太糟糕了,它不像 $product->getImages() 那么简单,嗯?
Okay, this is how I finally fixed my problem.
This is the link that finally set my head straight: http://www.magentocommerce.com/wiki/doc/webservices-api/api/catalog_product_attribute_media
Too bad it's not as simple as $product->getImages(), eh?