[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] Подсказки по API

[MODx] minishop2 tips

[Code helper] Заготовки для работы

Преобразовать JSON в HTML

[MODX] Загрузка сниппета после загрузки страницы через AjaxSnippet

[MODX, MiniShop2] Отредактировать письмо о заказе - добавить ТВ поле, или что-то еще

[MODX, pdoCrumbs] Вывести список всех родителей в ТВ поле ресурса

[JS] Связать значения инпутов через jQuery (биндинг)

[MODX] Массово обновить ТВ, или другое поле через базу

[miniShop2] Разместить корзину внутри блока с оформлением заказа

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

Вывести список всех файлов на сервере (и размер файла)

[PHP] Фиксированная сортировка массива на основе хэша

Курсы валют с cbr.ru на PHP, с запасным вариантом и кэшированием

[MODX] pThumb - ресайз изображений. Примеры использования.

Изменить цену на товар, если в корзине лежит товар из особой категории minishop2

Скрыть информацию о том, что сайт работает на MODX

[MODX] Сообщение о том, что сайт использует Cookie

Не работает подгрузка товаров ajax mfilter2 на мобильном

Постраничная навигация — набор параметров и CSS PdoPage

Разбить вывод pdoResources на несколько колонок (блоков)

[MODX] Добавить скрипт перед тегом body

[PHP] Узнать скорость выполнения кода. Простой таймер PHP

Вывести список всех емэйлов miniShop2

[MODX] Создать редирект через autoRedirector API

[MODX, MiniShop2] Отредактировать шаблон письма

[MODX] Кастомный чанк для AdminPanel

[MODX] Оформление и настройка easyComm. Комментарии и отзывы на сайте.

[MODX, MiniShop2] Обязательный чекбокс при оформлении заказа

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

[MODX, MiniShop2] Добавить в письмо контактную информацию

[MODX, MiniShop2] Email сделать не обязательным полем

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

[MODX, MiniShop2] Изменить формат номера заказа

Изменить цену на товар в зависимости от количества при добавлении в корзину minishop2

Общая сумма по каждому товару в корзине Minishop2

reCaptcha не через форму (без тега <form>)

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

pdoPage и getImageList - Постраничная навигация MIGX

[MODX] Соответствие названия классов с названиями таблиц в MySQL

Вывести 404 ошибку по настройки TV MODX

Расширить таблицу site_content (объект modResource) за 5 минут

Передать файл с одного на другой сервер

Создать ресурс процессором $modx->runProcessor('resource/create', $props)

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

[MODX, MIGX] Простейшая авторизация

[MIGX] Простая и симпатичная галерея fancybox

[MODX] Узнать размер файла

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

pdoResources Заготовки для работы

FontAwesome - часто используемые иконки для шаблонов MODX

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

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

Bxslider отображение картинок после полной загрузки слайдера

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

[MODX] Курсы валют с cbr.ru на PHP

[MODX, MIGX] Простой аудио-плеер HTML5

Как контролировать кэш CSS и скриптов

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

[PHP] Получить древовидный массив за один запрос к базе

Вырезать кавычки - фильтр MODx

Регулярное выражение

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

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

[MODx] Динамическое поле emailSubject в FormIt

[MODx] Установить шаблон по-умолчанию для новых, создаваемых ресурсов

[MODx,MiniShop2] Не приходит почта администратору

[MODx] Баннеры с использованием BannerY

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

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

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

Редиректы

[MODx] pdoPage pagination css

[MODx] Вывести время загрузки (формирования) страницы

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

[MODx, minishop] Фильтрация по TV параметрам в msProducts

Регулярные выражения notepad++ примеры

[MODx] Создать свою страницу в админке

[JS] Заготовочки

[MODx] Поиск на сайте с пакетом SimpleSearch

[MODx, XML] Ответ для сервиса moneta.ru

[MODx] Подключить MODx в стороннем PHP файле

[MODx] Создать пакет с пользовательской таблицей

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

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

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

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

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

[Opencart, FilterPro] Не работает пагинация

[OpenCart] Заготовки для автоматического заполнения товарами магазина 1.5.5.1.2

[PHP] Разные фишки, заготовки

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

[MySQL] Примеры запросов

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

[MODx] Дата на русском

[MODx] Ускорить установку MODx revo до пары кликов

[Opencart] API tips

[MODx, Quip] Отсортировать ресурсы по количеству комментариев Quip MODx

[PHP] Загрузить файл для постобработки

[Opencart 2] Показывать в категориях

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

[MODx] Получить grandparent. Вывести родитель родителя

[MODx] Вывести все доступные плейсхолдеры.

[MODx] getResources заготовки

[MODx] Счетчик посещений и скачиваний для сортировки ресурсов

[MODx] Как разместить исходный код сниппета на сайте, в документации

Удалить HTML-теги span, и стили из тега br

Полезные ссылки

Все записи