Для выгрузки в Яндекс.Маркет адреса картинок должны иметь адрес без пробелов и кириллических символов, и мало ли еще чего. Можно сказать, что допустимыми являются .-_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)
Не писать ответ