这是我最终在“shell/fix_images.php”中使用的解决方案:
<?php
ini_set('display_errors','On');
ini_set('memory_limit','512M');
error_reporting(E_ALL);
require_once('abstract.php');
class Mage_Shell_Updater extends Mage_Shell_Abstract
{
public function run()
{
$products = Mage::getResourceModel('catalog/product_collection')
->addAttributeToFilter('is_imported', 1); // attribute added by importer
$c=0;
foreach($products as $p) {
$pid = $p->getId();
$product = Mage::getModel('catalog/product')->load($pid);
$mediaGallery = $product->getMediaGallery();
if (isset($mediaGallery['images'])){
foreach ($mediaGallery['images'] as $image){
Mage::getSingleton('catalog/product_action')
->updateAttributes(array($pid), array('image'=>$image['file']), 0);
$c++;
break;
}
}
}
echo($c . " product(s) updated.");
}
}
$shell = new Mage_Shell_Updater();
$shell->run();
如果有人应该使用它,请务必从您自己的 Mage 方法链中删除“addAttributeToFilter”。如果您要将其作为独立脚本运行(不首先禁用实时索引),请在运行开始时添加此代码():
$pCollection = Mage::getSingleton('index/indexer')->getProcessesCollection();
foreach ($pCollection as $process) {
$process->setMode(Mage_Index_Model_Process::MODE_MANUAL)->save();
}
在运行()结束时:
foreach ($pCollection as $process) {
$process->setMode(Mage_Index_Model_Process::MODE_REAL_TIME)->save();
}
此外,abstract.php 来自 Mage_Shell,通常位于 Magento 安装根目录下的 /shell/ 目录中。