Автоматическая транслитерация имен картинок в MODX
Сегодня хотелось бы поговорить о том, как не испортить свои позиции в seo, а также сохранить хорошие отношения в коллективе. Особенно данная статья будет актуальна для владельцев интернет-магазинов и корпоративных сайтов, потому как в этих случаях над наполнением сайта часто работают несколько человек, а как известно, чем больше людей занимаются одним делом, тем выше шанс допустить ошибку.
Недавно к нам, с небольшой разницей во времени, попали два проекта с одной и той же проблемой, а именно большим количеством картинок с кириллицей и пробелами в названиях.
Первому сайту уже более 5 лет. За это время он прошёл через руки множества контент-менеджеров, маркетологов, seo-специалистов и программистов. Несколько десятков картинок с кириллицей и пробелами в названии присутствуют на нескольких сотнях страниц. Исправлять всё это неблагодарная и неприятная работа. Как только картинка переименована она перестаёт отображаться на сайте и необходимо найти и исправить ее имя на каждой странице. После выполнения данной работы мы задумались о том, как было бы хорошо, что бы допустить такую ситуацию было невозможно в принципе. Например, вы забыли проинструктировать вашего нового контент-менеджера, что бы система сама исправляла подобные ошибки на этапе загрузки файла.
Для этого сначала создадим сниппет который будет отвечать за транслитерацию имён файлов.
<?php
$converter = array(
'а' => 'a','б' => 'b','в' => 'v','г' => 'g','д' => 'd',
'е' => 'e','ё' => 'e','ж' => 'zh','з' => 'z','и' => 'i',
'й' => 'y','к' => 'k','л' => 'l','м' => 'm','н' => 'n',
'о' => 'o','п' => 'p','р' => 'r','с' => 's','т' => 't',
'у' => 'u','ф' => 'f','х' => 'h','ц' => 'c','ч' => 'ch',
'ш' => 'sh','щ' => 'sch', 'ь' => '','ы' => 'y','ъ' => '',
'э' => 'e','ю' => 'yu','я' => 'ya',
'А' => 'A','Б' => 'B','В' => 'V','Г' => 'G','Д' => 'D',
'Е' => 'E','Ё' => 'E','Ж' => 'Zh','З' => 'Z','И' => 'I',
'Й' => 'Y','К' => 'K','Л' => 'L','М' => 'M','Н' => 'N',
'О' => 'O','П' => 'P','Р' => 'R','С' => 'S','Т' => 'T',
'У' => 'U','Ф' => 'F','Х' => 'H','Ц' => 'C','Ч' => 'Ch',
'Ш' => 'Sh','Щ' => 'Sch', 'Ь' => '','Ы' => 'Y','Ъ' => '',
'Э' => 'E','Ю' => 'Yu', 'Я' => 'Ya',
' ' => '_'
);
$value = strtr($value, $converter);
return $value;
В сниппет мы передаём строку, он заменяет в неё кириллицу и возвращает новое значение.
Теперь необходимо проверить тип загружаемого файла и выполнить переименование. Для этого мы создадим плагин и включим в нём событие OnFileManagerUpload.
<?php
if ($modx->event->name =='OnFileManagerUpload' && in_array($files['file']['type'], array("image/png","image/jpeg"))) {
$modx->log(1, print_r($array, "<pre>".print_r($files)."</pre>"),'HTML');
if(preg_match("/[А-Яа-я]/", $files['file']['name']) or stristr($files['file']['name'], " ")){
$newName = $modx->runSnippet('translit',array(
'value' => $files['file']['name']
));
$modx->log(1, "новое имя ".$newName,'HTML');
for($i=1;$i!=-1;$i++){
$modx->log(1, "новое имя ".$newName,'HTML');
if (!file_exists($modx->config['base_path'].$directory.$newName)){
$modx->log(1, $modx->config['base_path'].$directory.$newName,'HTML');
rename($modx->config['base_path'].$directory.$files['file']['name'], $modx->config['base_path'].$directory.$newName);
break;
}
else {
$namePart = explode(".", $newName);
$newName = $namePart[0]."_c.".$namePart[1];
}
}
}
}
Работа плагина достаточно проста. При загрузке на сайт изображения, он определяет есть ли в нём кириллица или пробелы, после чего, если они найдены, выполняет замену. Далее плагин проверяет нет ли уже файла с таким названием и осуществляет переименование. Если файл с новым именем найден, то к новому файлов добавляется префикс “copy_”, после чего процедура проверки повторяется. И так до тех пор, пока не будет сгенерировано уникальное имя файла.
Так как на наших сайтах мы уже используем событие 'OnFileManagerUpload', мы интегрировали новый код в уже существующий плагин для подмены jpg и png на webp. Ознакомиться можно в репозитории.