Автоматическая транслитерация имен картинок в MODX

28 января 2022
assets/img/blog/730h430-seo.jpg Автоматическая транслитерация имен картинок в 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. Ознакомиться можно в репозитории.

img