Opencart - автоматическое создание SEO URL для товаров

Небольшая инструкция по добавлению автоматического создания урлов для товаров при их добавлении. Необходимо будет внести правку в один файл - модель товара в админке, после чего будет формироваться урл вида "id товара"-"название товара в транслите".html (можно сменить на что то свое)

ID товара решил использовать, что бы не допустить одинаковых ссылок.

Изменения. Откроем для редактирования файл /admin/model/catalog/product.php

Здесь, в функции addProduct (в конце данной функции), найдем следующее:

if ($data['keyword']) {
$this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int)$product_id . "', keyword = '" . $this->db->escape($data['keyword']) . "'");
}

И заменим на:

if ($data['keyword']) {
$this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int)$product_id . "', keyword = '" .  $this->db->escape($data['keyword']) . "'");
} else {
$tr = array ("А"=>"a","Б"=>"b","В"=>"v","Г"=>"g","Д"=>"d","Е"=>"e","Ж"=>"zh","З"=>"z","И"=>"i","Й"=>"j","К"=>"k","Л"=>"l",
"М"=>"m","Н"=>"n","О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t","У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
"Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"y","Ь"=>"","Э"=>"e","Ю"=>"yu","Я"=>"ja","а"=>"a","б"=>"b","в"=>"v","г"=>"g",
"д"=>"d","е"=>"e","ж"=>"j","з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l","м"=>"m","н"=>"n","о"=>"o","п"=>"p",
"р"=>"r","с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h","ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y","ы"=>"yi",
"ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya","."=>"-"," "=>"-","?"=>"-","/"=>"-","\\"=>"-","("=>"",")"=>"",
"*"=>"x",":"=>"-",","=>"-","\""=>"","№"=>"n",";"=>"","%"=>"","_"=>"-",">"=>"-","|"=>"-","'"=>"","--"=>"");
$my_seo_url  = strtr($value['name'] ,$tr);
$seo_url  = $product_id . '-' . $my_seo_url . '.html';
$this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int)$product_id . "', keyword = '" . strtolower($seo_url) . "'");
}

Как бы и все изменения.. Теперь если урл прописан - он и будет вставлен, если же не прописали - будет создан из ID и имени товара + в конце будет добавлено .html

Если есть желание что то поменять, в следующей строке как раз и формируется урл:

$seo_url  = $product_id . '-' . $my_seo_url . '.html';

к примеру, можно сделать так:

$seo_url  = strtr($data['model'] ,$tr) . '-' . $my_seo_url;

В таком варианте урл будет сформирован из модели и названия.

Если по поводу транслита есть альтернативные мнения - пишите.

Сказать $пасибо

Комментарии ()

  1. Ольга Ермакова 30 июля 2020, 15:33
    0

    Добрый день! А не подскажете ли — в информационных страницах, например, в стороннем модуле новостей, который лежит в папках где и information — так же делать? Просто если так же, то не выходит. Ничего не генерируется, увы.

    1. Владимир 31 июля 2020, 00:401
      0

      Здравствуйте! Должно работать, все так же. Посмотреть бы этот модуль… Как вариант, там уже есть подобное, на более раннем этапе и url приходит не пустой (один из модулей блога точно создает ссылки с помощью js)

    2. Мария 05 июня 2020, 20:50
      0

      Здравствуйте, Владимир, а Вы случайно не подскажете sql запрос к БД чтобы заменить в урлах % на —
      у меня в магазине больше 1000 товаров и урлы заполнены с пробелами, оупенкарт заменил их на % и вручную это очень долго менять, я подозреваю что можно запросом к БД это поправить… но у меня проблемы с синтакисом, боюсь поломать всё.

      1. Владимир 05 июня 2020, 22:15
        0

        Доброй ночи! Попробуйте вот так, в phpmyadmin:

        UPDATE `oc_url_alias` SET `keyword`= REPLACE(`keyword`, '%', '-');

      2. Валерий 04 августа 2016, 20:13
        0

        Здравствуйте, как сделать чтобы URL формировался с имени продукта?

        1. Татьяна 16 февраля 2016, 12:46
          0

          Не работает на осторе 2

          1. Владимир 16 февраля 2016, 13:13
            0

            Проверял на чистом опенкарте, хотя в оссторе в этой части различий не вижу, другое дело что здесь для opencart 1.5… Попробуйте заменить «if ($data['keyword']) {» на «if (isset($data['keyword'])) {», как это сделано в оригинале.

          2. Сергей 01 февраля 2016, 09:00
            +1

            Спасибо за доработку! Просто и функционально!

            1. Руслан 08 июня 2015, 17:53
              +1

              Можно ли как-то сделать чтобы в URL была категория товара, хотя бы первая присвоенная.

              1. Владимир 09 июня 2015, 05:52
                +1

                Вариант есть.. вопрос только что должно быть в итоге:
                categoria-tovar001 или categoria/tovar001?