Место для вас

Автоматическая генерация seo url для Opencart 2.x

С выходом моей статьи про генерацию seo url на лету для OpenСart 1.5.x прошло много времяни. За это время обновился сам OpenCart.

И к моему сожалению в плане автогенерации seourl на основе названия продукта OpenCart не продвинулся. Ну чтож. Придется самим с этим бороться.

Относительно первой версии изменения не большие.

Покажу пример на основе файла admin\model\catalog\product.php.

Тут такой момент важный есть. Может кто не знает, но чтоб работало seo url, нужно включить эту функцию в разделе: Редактирование настроек магазина -> Сервер -> Включить SEO URL -> Да и переименовать файл htaccess.txt в .htaccess

И так. Находим функцию public function addProduct($data). Ищем код:


if (isset($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 (isset($data['keyword']) & !(empty(trim($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
{
	// соотношение русской буквы к английской
	$str = array ("А"=>"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","Ъ"=>"","Ы"=>"YI","Ь"=>"","Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"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","."=>"-"," "=>"-","?"=>"-","/"=>"-","\\"=>"-","*"=>"-",":"=>"-","*"=>"-",
         ">"=>"-","|"=>"-","'"=>"",'"'=>"");

	// получаем название продукта
	$get_title = $this->db->escape($data['product_description'][1]['name']);

	// преобразовываем из русского в английский
	$my_seo_url  = strtr($get_title ,$str);

	// сохраняем в БД
	$this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int)$product_id . "', keyword = '" . strtolower($my_seo_url) . "'");
}

ЗЫ: для того, чтоб seourl генерировался автоматически при обновлении продукта, вам нужно будет внести эти же правки в функцию public function editProduct($product_id, $data)

Поясню теперь:
- Eсли поле SEO URL не пустое, то добавляем в БД то, что мы добавили ручками в этом поле.
- Если же поле SEO URL пустое, то генерируем ссылку опираясь на название продукта $data['product_description'][1]['name'], где 1 - это id языка. Конечно, если у вас несколько языков, то вам тут нужно указать тот id, на базе которого вам нужна генерация seo url. Или же, по дефолту в OpenCart идет по умолчанию english. И когда вы добавите русский язык и английский удалите, то тут нужно будет поставить id русского языка.

Предвидя возможный вопрос: А как мне сделать так, чтоб для каждого языка у меня был отдельный seo url?
Отвечаю: Об этом спрашивайте разрабов OpenCart или же нужно делать большие правки в коде. Муторное дело. Как-то я уже копался в этом деле, но по другому вопросу.

Да. OpenCart под seo не очень заточен. Хотя возможно есть готовые расширения. Не знаю. Я не делал мультиязычные магазины еще.

Ну вот в принципе и все. Ничего сложного. Кстати, для category.php тоже самое по аналогии с product.php.

И если вдруг вы решите обновить cms, то может быть вы затрете эти правки. Следовательно их нужно будет добавить еще раз.

PS: кажись для русской версии OpenCart (ocStore) эти правки подойдут. Пишите коменты если что. Разберемся.

Прикрепленные файлы:

catalog_product_autoseo.zip


Место для вас

Коментарии

добавить коментарий

  1. Артем - 05 апреля, 2016 в 12:06:33

    Саша, крайний ocStore - не хочет работать твой метод, ни в какую... Я вчера писал, что мне удалось заставить работу при помощи плагина. Сегодня специально удалил плагин, дабы проверить твой метод. Первую часть кода изменил (до "ЗЫ: для того, чтоб seourl генерировался автоматически при обновлении продукта" - это не менял, т.к. не совсем понимаю, куда там нужно вставлять код), но первый вариант у меня не заработал точно. Т.е. при добавлении товара.

    Никаких ошибок не выдаёт, просто ничего не происходит... Урл не меняется, ЧПУ не работает.

    Если не затруднит, скинь плз на почту правленный файл, может быть я косячу где-то... Но вроде не первый год замужем )) Код скопипастить умеемс )

    • Adminer - 24 ноября, 2016 в 09:59:39

      Артем, специально вот щас установил последний ocStore 2.1.0.2.1 и проверил. кстати, код не отличается от OpenCart. ошибок нет.  прикрепил файлы. проверь.

    • Артем - 24 ноября, 2016 в 09:59:56

      Adminer, не знаю тогда в чём может быть причина... Сделал подмену файлов savepic.org/8280351.png - не хочет он в базу ничего писать.


      Редактирование тоже не даёт результатов. При этом ошибок тоже никаких не выдаёт...


      Возможно на моей стороне проблема.. в настройках сервера что-то.. Не знаю, но лично у меня не заводится.

    • Админер - 24 ноября, 2016 в 09:59:58

      Артем, а ты поле seourl пустым оставляешь? ID языка совпадает с тем, что в файле указан? что логи говорят? можешь мне кинуть доступ в админку? ради интереса, попробуй установить на локалке чистую cms и туда запихнуть измененные файлы. посмотри, будет ли поле seourl заполняться?

  2. Админер - 24 ноября, 2016 в 10:00:02

    Артем, все блин. понял. попробуй эти файлы, что в архиве. я перезалил архив и поправил код в статье.

  3. Артем - 24 ноября, 2016 в 10:00:03

    Спасибо Саше, разобрались в чём причина. Она таилась в моей версии PHP, так сказать, индивидуальный подход нужен был :)

  4. Алексей - 24 ноября, 2016 в 10:01:52

    Здравствуйте

    Та же самая проблема

    Fatal error: Can't use function return value in write context in /var/www/u0190612/data/www/kpg-horeca.ru/admin/model/catalog/category.php on line 50

    Убираешь trim в строке:

    if (isset($data['keyword']) & !(empty(trim($data['keyword'])))) {

    все работает.

    • Админер - 24 ноября, 2016 в 10:01:54

      Алексей, ну да. тут сперва нужно убрать пробелы. а потом уже делать проверку:


      $data['keyword'] = trim($data['keyword']);
      if ( !(empty($data['keyword'])) ) {...}

      согласно документации:
      empty - проверяет если ПЕРЕМЕННАЯ пустая, а trim это функция
      вот тут наверное и фигня в разных версиях php происходит

  5. Илья - 24 ноября, 2016 в 10:02:08

    Спасибо огромное, все работает!

    2.1.0.2.1

  6. ЧТО?ГДЕ?КОГДА? - 24 ноября, 2016 в 10:02:37

    Добрый день. Подскажите как добавить в url еще и id товара?

    • админер - 27 апреля, 2017 в 08:50:44

      ЧТО?ГДЕ?КОГДА?,  ты че прикалываешься?


      посмотри на запрос добавления. там есть (int)$product_id


      ну добавь его к $my_seo_url как тебе надо
      $my_seo_url .'-'.(int)$product_id


      или ты не это имел ввиду?



       


       

  7. Михаил - 24 ноября, 2016 в 10:02:42

    На версии 2,2,0,0 не работает

  8. adminer - 27 апреля, 2017 в 08:51:22

    капец, чуваки, вы меня конечно извините, но вы блин хотя бы понимаете что я сделал? понимаете логику? вот что не рабтает? какую ошибку пишет?

  9. Артём - 24 ноября, 2016 в 10:02:49

    На 2.3.0.2 кто рискнет проверить?

    • Александр - 24 ноября, 2016 в 10:02:55

      Артём, я рискнул. работает 1000%


      Ребят, ко всем вопрос: а вы вообще поняли по какому принципу работает этот метод? проверял на php 5.5, 5.6, 7.0

      может у вас какие-то ошибки есть в логах?


      и если что, то пишите письмо с прикрепленным файлом. я посмотрю у себя на локалке

  10. Сергей - 24 ноября, 2016 в 10:02:51

    Александр здравтсуйте! Установил на OcStore 2.1.0.2.1  автоматически ничего не заполняется все так же как и раньше. Можете помочь?

    • Александр - 24 ноября, 2016 в 10:02:57

      Сергей, а разницы нет никакой. только что просмотрел и проверил, чтоб уж на верняка. если что, то пишите письмо с прикрепленным файлом. я посмотрю у себя на локалке

  11. Евгений - 24 ноября, 2016 в 10:01:01

    Спасибо, все классно, вот только строка если попадется вида

    "Привет как твои дела + еще что то";

    То на выходе получаем: Privet-kak-tvoi-dela-+-esche-chto-to
    Нужно сделать проверку а вернее обрезать все повторяющиеся символы
    Ну и привести к нижнему регистру.


    • adminer - 27 апреля, 2017 в 08:51:10

      Евгений, рад, что разобрались. тут главное принцип понять, а потом под себя уже подгонять сколь угодно.

  12. Александр - 12 декабря, 2016 в 05:57:49

    ocstore 2.1.0.1 магазин лег
    http://prntscr.com/di8o29

    • adminer - 27 апреля, 2017 в 08:51:07

      Александр, а логи что говорят вам об этом? ребят, вы че?

  13. Елена - 07 марта, 2017 в 05:25:39

    Спасибо большое! А у меня всё почти с первого раза заработало! Просто забыла id языка отследить, но, как только исправила, все стало замечательно! УРА! 

    • админер - 27 апреля, 2017 в 08:50:55

      Елена, спасибо вам. А то я уже судя по коментам думал, что у меня особенные версии ОС =)

    • Влад - 21 июля, 2017 в 08:20:00

      Елена, подкажите куда вставить id языка! Спасибо!

  14. Александр - 21 июля, 2017 в 08:19:51

    На моем OC 2.2.0.0 не сработало. Возможно из-за того, что мешает встроенный SEO-плагин в тему Ultimate Seo Package. Отключить его не могу, и толку от него никакого.

    Все проверил: и ID языка, и версию php менял. Ноль! Вообще никакой реакции. В логах также ничего.

    • adminer - 21 июля, 2017 в 08:19:54

      Александр, вам нужно выяснить куда попадает содержимое сео поля. в product.php или еще куда-то.

  15. Андрей - 21 июля, 2017 в 08:20:04

    Обновил код в admin\model\catalog\product.php по примеру. У меня при обновлении продукта в поле SEO URL  записывает в БД латинскую букву " r ". Что бы это значило? Почему не происходит автогенерация?

  16. Alex - 21 июля, 2017 в 13:47:34

    У SEO Module https://opencartseomodule.com/ больше всего СЕО фишек чем у любого другого модуля. всем советую

  17. adminer - 26 июля, 2017 в 19:18:29

    Андрей, по всей видимости у вас буква Г волшебная. код в студию.

    Alex, это платное решение. а если это платно, то не по адресу. за деньши уже много решений. но вопрос в том, как сделать самому и сэкономить бабулесики.

     

     

  18. Серж Ткач - 16 августа, 2017 в 08:42:37

    Повторю суть комментария к статье https://zawebis.com/php-i-sql/cms/opencart/avtozapolnenie-pola-seo-url-v-opencart.html

    Есть готовые решения — зачем делать то, что уже сделано. Вот прекрасный модуль автоматической генерации ЧПУ для OpenCart2. Бесплатный!

    • adminer - 16 августа, 2017 в 15:08:35

      Серж Ткач, когда я давненько делал это решение, то бесплатного модуля не было тогда.

    • Серж Ткач - 17 августа, 2017 в 08:29:24

      adminer, я не подумал об этом. Хотел просто поделиться :)

    • adminer - 17 августа, 2017 в 08:31:06

      Серж Ткач, понятно. спасибо. может поможет тем, у кого "не получается" понять смысл манипуляций с кодом!

    • Серж Ткач - 17 августа, 2017 в 11:33:37

      adminer, zawebis.com — это Ваш проект?


      Я вчера впервые его увидел. Занятный сайт

    • adminer - 17 августа, 2017 в 11:35:21

      Серж Ткач, эээээммм... странно. вы уже оставили несколько коментов. где и как вы постили коменты тогда тут?

    • Серж Ткач - 17 августа, 2017 в 11:44:07

      adminer, вчера и оставил на обоих статьях :)

    • adminer - 17 августа, 2017 в 13:54:05

      Серж Ткач, да, это мой проект.  WP меня не устроил, как и большинство CMS. пришлось переписать на другой фреимворк. как результат: скорость, лекгость, скилл и чистота.

Добавить коментарий

кликните на картинку,
чтоб обновить код

Что за сайт

Этот сайт представляет унифицированную базу, где инфа собрана в единое целое, а не разбросанна по многочисленным сайтам, записям на листах бумаги или головам людей; а так же доступна круглосуточно не зависимо от кого-либо или чего-либо.

Будь в курсе

Интересненько

Вверх