[OpenCart 1.5.1] Массово изменить адреса картинок у товаров

Для выгрузки в Яндекс.Маркет адреса картинок должны иметь адрес без пробелов и кириллических символов, и мало ли еще чего. Можно сказать, что допустимыми являются .-_0-9a-Z. Но вот у нас есть магазин на ~50 тысяч товаров, у которых много где оказались пробелы в именах папок, и кое-где кириллица в именах папок.

Пояснения скрипта: Подключаем конфиг и vqmod. Далее есть несколько блоков кода, которые активируются при наличии GET-запроса:

  • scriptname.php?my_scandir=1
    Просто выводит список папок
  • scriptname.php?debug_monitor=1
    Выводит список файлов, для которых нет соответствия в базе
  • scriptname.php?rename_folders=1
    Вырезает пробелы из папок (заменяет на "_")
  • scriptname.php?rename_files=1
    Транслитизирует кириллицу

Нюанс - У меня в некоторых ситуациях почему-то возвращалось false при попытки переименовать файпку, при этом папка все таки была переименована. При такой ситуации просто выводится запрос MYSQL, который можно вручную активировать в phpmyadmin, убедившись, что папки переименованы.

echo "<pre>";
require_once('config.php');

// VirtualQMOD
require_once('./vqmod/vqmod.php');
VQMod::bootup();

// VQMODDED Startup
require_once(VQMod::modCheck(DIR_SYSTEM . 'startup.php'));

// Application Classes
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/customer.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/affiliate.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/currency.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/tax.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/weight.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/length.php'));
require_once(VQMod::modCheck(DIR_SYSTEM . 'library/cart.php'));

// Database 
$db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
function rus2translit($str) {
    $rus = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
    $lat = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya');
    return str_replace($rus, $lat, $str);
  }
function str2url($str) {
	$ch = mb_detect_encoding($str);
	$str = iconv ( $ch , "UTF-8" , $str );

    $str = rus2translit($str);
    $str = mb_strtolower($str);
    $str = preg_replace('~[^.\-a-z0-9_]+~u', '_', $str);
    // удаляем начальные и конечные '-'
    //$str = trim($str, "__");
    return $str;
}
if(!empty($_GET['debug_monitor'])){
	$request = $db->query("SELECT product_id, image from ".DB_PREFIX."product where image like '% %'");
	foreach($request->rows as $v){
		if(!file_exists(DIR_IMAGE.$v['image'])){
			echo $v['image']."\r\n";
		}
	}
	$request = $db->query("SELECT image from ".DB_PREFIX."product_image where image like '% %'");
	foreach($request->rows as $v){
		if(!file_exists(DIR_IMAGE.$v['image'])){
			echo $v['image']."\r\n";
		}
	}
}

if(!empty($_GET['rename_folders'])){
	$request = $db->query("SELECT product_id, image from ".DB_PREFIX."product where image like '% %'");

	$folders = array();
	foreach($request->rows as $v){
		$pi = pathinfo($v['image']);
		
		$folder_hash = md5($pi['dirname']);
		
		if(empty($folders[$folder_hash]) AND strpos($pi['dirname']," ") !== false){
			$folders[$folder_hash] = $pi['dirname'];
		}
		//echo $pi['dirname']."\r\n";
	}
	//echo count($folders);
	print_r($folders);
	function renameInDB($dirname_old, $dirname_new){
		global $db;

		$update_product_str = "UPDATE ".DB_PREFIX."product SET image = REPLACE(image, '".$db->escape($dirname_old)."', '".$db->escape($dirname_new)."') WHERE image LIKE '".$dirname_old."%'";
		$update_product_image_str = "UPDATE ".DB_PREFIX."product_image SET image = REPLACE(image, '".$db->escape($dirname_old)."', '".$db->escape($dirname_new)."') WHERE image LIKE '".$dirname_old."%'";
		$db->query($update_product_str);
		$db->query($update_product_image_str);
		
	}
	foreach($folders as $v){
		$request = $db->query("SELECT product_id, image from ".DB_PREFIX."product where image like '".$v."%'");
		foreach($request->rows as $r){
			//echo $r['product_id'].",";
		}

		$dirname_to_rename = array();
		foreach(explode("/", $v) as $dir){
			$dirname_to_rename[] = $dir;
			if(strpos($dir," ") !== false){
				break;
			}
		}
		$dirname_old = implode("/",$dirname_to_rename);
		$dirname_new = str_replace(" ", "_", $dirname_old);
		
		if(rename(DIR_IMAGE.$dirname_old, DIR_IMAGE.$dirname_new)){
			echo "+++".$dirname_old."\r\n";
			echo "+++".$dirname_new."\r\n";
			renameInDB($dirname_old, $dirname_new);
		}else{
			$update_product_str = "UPDATE ".DB_PREFIX."product SET image = REPLACE(image, '".$db->escape($dirname_old)."', '".$db->escape($dirname_new)."') WHERE image LIKE '".$dirname_old."%';";
			$update_product_image_str = "UPDATE ".DB_PREFIX."product_image SET image = REPLACE(image, '".$db->escape($dirname_old)."', '".$db->escape($dirname_new)."') WHERE image LIKE '".$dirname_old."%';";
			echo $update_product_str."\r\n";
			echo $update_product_image_str."\r\n";
		}	
	}
}
if(!empty($_GET['rename_files'])){
	
	
	
	$request = $db->query("SELECT product_id, image from ".DB_PREFIX."product where image != ''");
	foreach($request->rows as $v){
		$pi = pathinfo($v['image']);
		if(!empty($pi['extension'])){
			$validname = preg_replace("/[^,.\-_0-9a-Z]/", '_', $pi['basename']);
			if($validname !== $pi['basename']){
				$old_filename = $v['image'];
				$new_filename = $pi['dirname']."/".str2url($pi['filename']).".".$pi['extension'];
				//echo $pi['filename'].".".$pi['extension'].str2url($pi['filename']).".".$pi['extension']."\r\n";
				
				
				$postfix = 1;
				
				if(file_exists(DIR_IMAGE.$new_filename)){
					$new_filename = $pi['dirname']."/".str2url($pi['filename'])."-".$postfix.".".$pi['extension'];
					$postfix++;
				}
				if(rename(DIR_IMAGE.$old_filename, DIR_IMAGE.$new_filename)){
					$update_product_str = "UPDATE ".DB_PREFIX."product SET image = REPLACE(image, '".$db->escape($old_filename)."', '".$db->escape($new_filename)."') WHERE image = '".$old_filename."'";
					$update_product_image_str = "UPDATE ".DB_PREFIX."product_image SET image = REPLACE(image, '".$db->escape($old_filename)."', '".$db->escape($new_filename)."') WHERE image = '".$old_filename."'";
					$db->query($update_product_str);
					$db->query($update_product_image_str);
					echo "+++".$old_filename."\r\n";
					echo "+++".$new_filename."\r\n\r\n";
					usleep(2000);
				}else{
					echo "---".$old_filename."\r\n";
					echo "---".$new_filename."\r\n";
				}
				//echo $validname."\r\n\r\n";
			}else{
				//echo "2-";
			}
		}else{
			echo "1-";
		}
	}
}


if(!empty($_GET['my_scandir'])){
	function my_scandir($dir){
		$files = scandir($dir);
		foreach($files as $file){
			if($file != "." AND $file != ".."){
				if(is_dir($dir."/".$file)){
					if(strpos($file," ") !== false){
						echo $dir."/".$file."\r\n";
					}
					my_scandir($dir."/".$file);
				}
			}
		}
	}
	my_scandir(DIR_IMAGE."data");
}

echo "</pre>";

Комментарии (0)

  1. Напишите первый комментарий
*Комментарий будет опубликован после проверки модератором

[MODx] Генератор настроек MIGX

[MODx, MIGx] Документация на русском по MIGX

[MODX] Импорт и экспорт в MiniShop2. Реализация 1

[MODx] minishop2 tips

[JS] Маска для ввода телефона +7(___)___-__-__

[MODx, miniShop2] Генерация YML для выгрузки в маркет

Как включить HTTPS (SSL) в MODX - Подробная инструкция

[MODx] Подсказки по API

[OpenCart] Вывести на главную все категории с картинками

[MODx, MIGX] Примеры использования

[MODx] Сайт на обслуживании (выключить сайт)

Универсальная форма обратной связи — feedBackForm

[PHP, JSON] Пример перевода с помощью Yandex Translate API

[MODx, Gallery] Галерея. Вывести обложки альбомов и фотографии

Расширение свойств товаров minishop2

[Opencart] Вернуть английский язык, если вы его удалили

[OpenCart] Вывести модуль напрямую через контроллер

[MODx, Quip] Более рабочий вариант.

[MODX, MIGX] Вывести getImageList только если он не пустой

[MODX, MIGX] Тип поля "Список ресурсов" (resourcelist) с ограничением по родителю (parents)

Красивое адаптивное меню под pdoMenu

[MODx] Создать источник файлов

[MODx] Вывод tv-параметров в формате [название TV] - [значение TV]

[PHP] Простое логирование

[MODX] Вывести список всех опций MiniShop2

Все записи