Место для вас

Автозаполнение поля seo url в Opencart

Хоть OpenCart 1.5 имеет встроенный модуль создания ЧПУ-ссылок(seo url), но заполнять это поле вручную порою бывает ооочень лень. Представьте себе заголовок товара из 50-70 символов и 100 штук товаров. Брать и переделывать такой заголовок продукта очень долго и не удобно.

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

!!! ВНИМАНИЕ: требуется изменения файлов в папке admin\model\catalog\
- category.php (для создания seo url для категорий)
- product.php (для создания seo url для продуктов)

Покажу пример на основе category.php. Для продуктов (products.php) аналогично.

Разрабатывалось мною для версии OpenCart 1.5.3

в файле category.php находим функцию public function addCategory($data) и в ней находим if ($data['keyword']) {} и после закрывающей скобки добавить


else
{
    $get_my_title = $this->db->escape($value['name']); // получаем название категории
    $tr = 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","."=>"-"," "=>"-","?"=>"-","/"=>"-","\\"=>"-","*"=>"-",":"=>"-","*"=>"-",
                 ">"=>"-","|"=>"-","'"=>""); //это массив для транслитерации
    $my_seo_url  = strtr($get_my_title ,$tr);
    $this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'category_id=" . (int)$category_id . "', keyword = '" . strtolower($my_seo_url) . "'");// записываем seo url в базу данных
}

И все. Сохраняем (тут нужно сохранять с кодировкой UTF-8 без BOM). Теперь когда вы создаете категорию, то seo url будет создаваться автоматически. Вам не нужно заботиться о его создании самому или платить деньги кому-то.

Так же хочу отметить, что тут еще я добавил функцию транслитерации. Теперь русские названия превращаются в "англонаписанные" =)

Тоже самое можно если нужно проделать для product.php Только эти изменения применяются в функции public function addProduct($data)
Находим строку foreach ($data['product_description'] as $language_id => $value) {
и тут, сразу после открывающей скобки добавляем $get_my_title = $this->db->escape($value['name']); // получаем название продукта

а дальше , как и в предыдущем случае находим if ($data['keyword']) {}
и вставляем после закрывающей скобки

else
{
	$tr = 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","."=>"-"," "=>"-","?"=>"-","/"=>"-","\\"=>"-","*"=>"-",":"=>"-","*"=>"-",
	">"=>"-","|"=>"-","'"=>""); //это массив для транслитерации
	$my_seo_url = strtr($get_my_title ,$tr);
	$this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int)$product_id . "', keyword = '" . strtolower($my_seo_url) . "'");// записываем seo url в базу данных
}

Запомните, что если вы обновите движок, то эти изменения полетят.

PS: вот статья про то, КАК АВТОМАТИЧЕСКИ СГЕНЕРИРОВАТЬ SEO URL ДЛЯ OPENCART 2.x.


Место для вас

Коментарии

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

  1. Сергей - 18 марта, 2016 в 14:27:43

    Полезная статья, но уточню, что данный код работает только при создании новой категории или товара. Для того, чтобы работало и при редактировании, нужно ниже найти в функции редактирования блок с "if ($data['keyword']) " и вставить такой же код и там. Плюс, в символы транслитерации добавил такие знаки, как запятая, скобки, проценты, восклицательный и вопросительный знаки.

    • Админер - 18 марта, 2016 в 14:27:50

      Сергей, спасибо.


      я знаю, что код не идеален. но все руки не доходят пофиксить код. а с другой стороны надо ли это делать? под вторую версию опенкарта сделали полноценный ocmod на основе моего же этого примера.

    • Артем - 04 апреля, 2016 в 13:13:08

      Админер, сделать то сделали, но вот сейчас пытаюсь настроить ocstore 2.1.0.2.1, не работает там автозаполнение. Возможно это у меня так... в принципе, новичок в опенкарте.

    • Админер - 05 апреля, 2016 в 12:06:05

      Артем, вы юзали модуль или использовали решение из статьи?
      я накидал во время обеда. не могу проверить. и не гарантирую сейчас верность, но суть думаю будет ясна. если нет, то продолжим.
      я открыл файл \admin\model\catalog\product.php и в функцию addProduct начиная с 118 сроки внес изменения:


              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']) . "'");
              }
              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","."=>"-"," "=>"-","?"=>"-","/"=>"-","\\"=>"-","*"=>"-",":"=>"-","*"=>"-",
                       ">"=>"-","|"=>"-","'"=>""); //это массив для транслитерации

                  foreach ($data['product_description'] as $language_id => $value)
                  {

                      $get_my_title = $this->db->escape($value['name']); // получаем название категории
                      $my_seo_url  = strtr($get_my_title ,$str);

                      $this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int)$product_id . "', keyword = '" . strtolower($my_seo_url) . "'");
                  }
              }




      попробуйте. и скажите результат.

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

    Админер, Благодарю за ответ.

    К сожалению, после всех манипуляций с файлом (т.е. вставляю код предложенный Вами в файл product.php), после добавления товара, урл остаётся без ЧПУ (т.е. не срабатывает автоподстановка), затем, после повторного захода в админке в этот товар, вверху я получаю такую ошибку: savepic.org/8301835.png

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

    • Админер - 05 апреля, 2016 в 12:06:10

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


              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
              {
                  $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_my_title = $this->db->escape($data['product_description'][1]['name']);
                  $my_seo_url  = strtr($get_my_title ,$str);

                  $this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int)$product_id . "', keyword = '" . strtolower($my_seo_url) . "'");
              }

      дело в том, что у opencart один seourl не зависимо от языков. будь у меня один язык или несколько, но seourl будет везде одинаковый. честно говоря глупый подход. но я не сеошник. может так и верно. фиг его знает. а если мне надо чтоб для каждого языка был свой url?
      пробуйте. а мне надо будет сделать новую статью.
      только обратите внимание на $data['product_description'][1]['name']
      1 - это id языка. если у вас несколько языков в системе, то надо подставить тот, с языка которого, вам нужна генерация seourl.

    • Админер - 05 апреля, 2016 в 12:06:15

      Артем, хз. у меня отработало. Давай так поступим. Я тебе пришлю файл целиком. Но тока завтра. Исходники на работе.

    • Артем - 05 апреля, 2016 в 12:06:17

      Админер, благодарю за предложение и в целом большое спасибо за фидбек! Пороборся я с плагином - goo.gl/1tunRV вроде всё завелось... Только вот один момент не ясен, неужели всё так печально, что после добавления любого материала нужно кэш сбрасывать? Это ведь неистовая боль какая-то получается... Впервые такое встречаю, при том что работал с кучей разных CMS.

    • Админер - 05 апреля, 2016 в 12:06:22

      Артем, я все равно попробую полностью для 2ой версии выложить статью. без плагинов. И файл приложить.


      по поводу кеша:
      а если оотключить кеширование?

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

    Админер, сорри, выше ошибся линком на плагин. Вот актуальная - goo.gl/QUT5Tx

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

    Действительно, зачем вручную, если есть модули. Например SEO URL Generator FREE — генерирует ЧПУ автоматически от языка по умолчанию без необходимости ручных правок (в отличие от другого подобного модуля)

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

Что за сайт

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

Будь в курсе

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

Вверх