After trying out a bunch of different versions I landed in this one which works for me every time. The key for me was removing all image settings for each store before I could completely delete the images from the system.
<?php
require_once 'app/Mage.php';
Mage::app('default');
// Retrieve all products. You could populate the array from, for example, a list of SKUS if you only want to delete images on a subset
$products = Mage::getModel('catalog/product');
$prodIds=$products->getCollection()->getAllIds();
$nrOfProducts = count($prodIds);
$values = array(
'image'=>'no_selection',
'small_image'=>'no_selection',
'thumbnail'=>'no_selection',
);
//Populate this array with IDs of ALL your store fronts
$store_fronts = array(1,2);
foreach ($store_fronts as $store_front)
{
Mage::app()->getStore()->setId($store_front);
Mage::getSingleton('catalog/product_action')->updateAttributes($prodIds, $values, $store_front);
}
Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID);
Mage::getSingleton('catalog/product_action')->updateAttributes($prodIds, $values, Mage_Core_Model_App::ADMIN_STORE_ID);
$counter = 0;
foreach($prodIds as $productId) {
++$counter;
$products = Mage::getModel('catalog/product');
$product = $products->load($productId);
$attrCode = 'media_gallery';
$mediaGalleryData = $product->getData($attrCode);
if (isset($mediaGalleryData['images'])) {
foreach ($mediaGalleryData['images'] as &$image) {
$image['removed'] = 1;
}
$product->setData($attrCode, $mediaGalleryData);
echo "Saving product ".$name." (".$counter." / ".$nrOfProducts.") \n";
try{
$product->save();
} catch (Exception $e)
{
echo "Exception saving ".$name.", skipping\n".$e->getMessage()."\n";
}
}
}
?>