我有一个外部脚本,它基本上获取产品并排除所有图像。脚本其实很简单

include('app/Mage.php');
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
error_reporting(E_ALL | E_STRICT);
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
ob_implicit_flush (1);
$mediaApi = Mage::getModel("catalog/product_attribute_media_api");
$_product = Mage::getModel('catalog/product')->load(15509);
$_images = $_product->getMediaGalleryImages();
foreach($_images as $_image)
{
    $mediaApi->update($_product->getId(),  $_image->getFile(),array('exclude' => 1));
}

查看原始数据库,我可以看到表 Catalog_product_entity_media_gallery_value 已成功更新,例如,对于产品的 10 个图像,禁用列现在设置为 1。我还可以看到,图像在管理系统的产品图像详细信息页面的排除框中有一个勾号。

然而....

当我进入前端时,它仍然向我显示该产品的所有图像。当我在前端调试时,我可以看到图像的禁用标志仍然设置为 0。下面的例子

object(Varien_Object)#1036 (7) {
["_data":protected]=>array(11) {
["value_id"]=>
string(5) "15083"
["file"]=>
string(43) "/F/F/FF6D86FE39366DF362D711765C56FDAA_1.jpg"
["label"]=>
string(0) ""
["position"]=>
string(1) "1"
["disabled"]=>
string(1) "0"
["label_default"]=>.........

我已尝试清除所有缓存并重新索引,但仍然遇到同样的问题。

奇怪的事情让我相信如果我运行以下原始 SQL 它不是缓存

UPDATE `catalog_product_entity_media_gallery_value` SET `disabled` = '1' WHERE `disabled` = '0';

前端的图像不显示,所以就好像我在脚本中禁用了错误的图像,但我不知道如何

有人可以帮忙吗?

*****更新*****如果我查看了实际的mysql表 catalog_product_entity_media_gallery_value 查找 value_id 15083 我可以看到有 2 条记录。

value_id    store_id    label   position    disabled
15083           0        \N       0           1
15083           1        \N       1           0

所以我的脚本只更新商店 id 为 0 的记录

所以这让我想到了两个问题

  1. 如何更新图像以便它在所有商店中都适用
  2. 为什么有 2 行,因为 Magento 实例只有 1 个商店
有帮助吗?

解决方案

即使您只有一家商店,您也有默认设置、网站设置和商店视图设置。因此,您仍然可以使用所有三个级别的覆盖设置。

如果您不使用此功能,最简单的部分就是删除所有条目 where store_id != 0

如果您不想执行此操作,只需确保更新图像的所有条目即可。

其他提示

看来您正在使用以下行在脚本中设置默认存储 Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);. 。这意味着您要更新的产品行将用于管理部分。

您应该能够通过 api 调用指定要更新的商店。

更新函数采用一个参数存储,可以是存储 id。您还可以简单地向其传递产品 ID 而不是产品对象,然后它要做的第一件事就是为您想要的商店初始化产品。

public function update($productId, $file, $data, $store = null, $identifierType = null)
许可以下: CC-BY-SA归因
scroll top