Как правильно создать ЧПУ из заголовка новости (title)?

98
03 сентября 2019, 08:10

Нашел функцию преобразующую заголовки на русском и казахском языках в английские буквы.

function translitURL($str) 
{
    $tr = array(
        "А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
        "Д"=>"d","Е"=>"e","Ё"=>"yo","Ж"=>"zh","З"=>"z","И"=>"i",
        "Й"=>"j","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
        "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
        "У"=>"u","Ф"=>"f","Х"=>"x","Ц"=>"c","Ч"=>"ch",
        "Ш"=>"sh","Щ"=>"shh","Ъ"=>"j","Ы"=>"y","Ь"=>"",
        "Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"yo","ж"=>"zh",
        "з"=>"z","и"=>"i","й"=>"j","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"x",
        "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh","ъ"=>"j",
        "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya", 
        " "=> "-", "."=> "", "І"=> "i",
        "і"=> "i", "Ң"=> "n", "ң"=> "n", 
        "Ү"=> "u", "ү"=> "u", "Қ"=> "q", 
        "қ"=> "q", "Ұ"=> "u",
        "ұ"=> "u", "Ғ"=> "g", "ғ"=> "g", 
        "Ө"=> "o", "ө"=> "o", "Ә"=> "a", 
        "ә"=> "a"                           
    );
    // Убираю тире, дефисы внутри строки
    $urlstr = str_replace('–'," ",$str);
    $urlstr = str_replace('-'," ",$urlstr); 
    $urlstr = str_replace('—'," ",$urlstr);
    // Убираю лишние пробелы внутри строки
    $urlstr=preg_replace('/\s+/',' ',$urlstr);
     if (preg_match('/[^A-Za-z0-9_\-]/', $urlstr)) {
        $urlstr = strtr($urlstr,$tr);
        $urlstr = preg_replace('/[^A-Za-z0-9_\-]/', '', $urlstr);
        $urlstr = strtolower($urlstr);
        return $urlstr;
    } else {
        return strtolower($str);
    }
} 

Не пойму, как лучше ее использовать, на каком этапе?

У меня есть возможность заносить сгенерированный таким образом url в базу данных на этапе добавления новости.

Я слышал, что заносить в базу данных это не нужно.

Как быть, как правильно?

Как далее использовать эту функцию?

Изначально перед итоговым результатом планировал добавлять id новости, пример:

123-novost.html

Answer 1

Никто не мешает использовать оба подхода - помещать в ссылку как ид новости (это в любом случае обязательно, поскольку заголовок может потом измениться, а ид - нет), так и заголовок, чисто для SЕО, если кто в него верит.

При этом транслитерировать заголовок не обязательно, достаточно url-кодирования. Так что в теории никакая функция не нужна. Если же хочется обязательно с транслитерацией, то убрать хотя бы из функции бессмысленный код: вместо того, чтобы преобразовывать каждый символ по 10 раз, мы просто заменяем любое количество недопустимых символов на дефис:

function translitURL($str) 
{
    $translit = array(
        "А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
        "Д"=>"d","Е"=>"e","Ё"=>"yo","Ж"=>"zh","З"=>"z","И"=>"i",
        "Й"=>"j","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
        "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
        "У"=>"u","Ф"=>"f","Х"=>"x","Ц"=>"c","Ч"=>"ch",
        "Ш"=>"sh","Щ"=>"shh","Ъ"=>"j","Ы"=>"y","Ь"=>"",
        "Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"yo","ж"=>"zh",
        "з"=>"z","и"=>"i","й"=>"j","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"x",
        "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh","ъ"=>"j",
        "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya", 
        "І"=> "i","і"=> "i", "Ң"=> "n", "ң"=> "n","Ү"=> "u",
        "ү"=> "u", "Қ"=> "q","қ"=> "q", "Ұ"=> "u","ұ"=> "u",
        "Ғ"=> "g", "ғ"=> "g","Ө"=> "o", "ө"=> "o", "Ә"=> "a", 
        "ә"=> "a"                           
    );
    $str = strtr($str, $translit);
    $str = preg_replace('/[^A-Za-z0-9_-]+/', '-', $str);
    $str = strtolower($str);
    return $str;
} 
READ ALSO
Подпись запроса при валидации apple pay c backend PHP

Подпись запроса при валидации apple pay c backend PHP

Ситуация такая Apple Pay и tinkoff После создания платежной сессии

81
Как протестировать метод?

Как протестировать метод?

Подскажите какой можно написать тест PhpUnit на следующий метод(метод парсит ресурс и сохраняет ссылки в csv)

100
Десериализация пустого словаря в Json.Net без JSON_FORCE_OBJECT

Десериализация пустого словаря в Json.Net без JSON_FORCE_OBJECT

Существует сервис на PHP, от которого я получаю json и выполняю при помощи JsonNet парсинг

103