Переделываем чпу opencart

24.10.2015 02:48

Opencart имеет готовую систему чпу, которая отлично работает без дополнительных модулей. Но у неё есть 1 большой недостаток: она позволяет построить путь к странице множеством разных способов. Например: если Вы перейдёте на товар с главной страницы, то получите путь вида: http://opencart.allwebstuff.info/macbook, а если сперва зайдёте в категорию "ноутбуки", затем в подкатегорию "mac" и только потом в товар "MacBook" тогда путь примет вид: http://opencart.allwebstuff.info/laptop-notebook/macs/macbook.

Такая ситуация негативно сказывается на продвижении. Да и система чпу opencart позволяет уже по первому параметру идентифицировать страницу. По этому давайте уберём в чпу лишние вложения.

Для начала нужно включить обработку чпу: заходим в корневой каталог, включаем показ скрытых файлов и находим файл ".htaccess.txt", переименовываем его в ".htaccess".

Затем открываем админку opencart, переходим в "Система"=> "Настройки"=> "Ваш магазин"=> "Сервер", активируем переключатель "Включить ЧПУ".

o-cpu

Чпу активировано и готово к использованию. Для того чтобы категория или товар открывались по чпу url, нужно каждый из них отредактировать и в графе "SEO URL" вписать его новый адрес. Напомню, что адрес должен быть уникальный, нельзя сделать категорию "MacBook" и товар "MacBook".

Теперь возьмёмся непосредственно за переделку движка. Открываем файл: /catalog/controller/product/category.php, находим следующий текст:

$data['products'][] = array(
  'product_id'  => $result['product_id'],
  'thumb'       => $image,
  'name'        => $result['name'],
  'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8')), 0, $this->config->get('config_product_description_length')) . '..',
  'price'       => $price,
  'special'     => $special,
  'tax'         => $tax,
  'minimum'     => $result['minimum'] > 0 ? $result['minimum'] : 1,
  'rating'      => $result['rating'],
  'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)

Меняем в нём строчку:

  'href'        => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)

На

  'href'        =>$this->url->link('product/product', '&product_id=' . $result['product_id'])

Находим текст:

$data['categories'][] = array(
'name'  => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''), 'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url), 'thumb'=>$this->model_tool_image->resize($result['image'], $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height')));

И меняем его на:

$data['categories'][] = array(
'name'  => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''), 'href'  => $this->url->link('product/category', 'path=' .  $result['category_id'] . $url), 'thumb'=>$this->model_tool_image->resize($result['image'], $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height')));

После этого все ссылки из списка товаров, в категориях, будут короткими.

Далее открываем файл: /catalog/controller/common/header.php, находим текст:

$children_data[] = array(
'name'  => $child['name'] . ($this->config->get('config_product_count') ? ' (' . $this->model_catalog_product->getTotalProducts($filter_data) . ')' : ''),
'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
);

Меняем строчку:

'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])

На:

'href'  => $this->url->link('product/category', 'path=' . $child['category_id'])

Все ссылки в главном меню так же стали короткими. Далее, если Вы используете какие-либо модули, то и в них придётся вручную переделать формирование url страницы. Принцип очень простой: функция link возвращает сео урл, и чтобы она возвращала его в коротком виде, параметры должны передаваться как: link('route','path'). Где 'route'- это путь к контроллеру, например 'product/category' для категории и 'product/product' для товара. А 'path'- должен содержать только путь к странице, без вложений, для товара это: 'product_id=ID_товара', для категории это: 'path=ID_категории'.

Пример всего вышесделаного, как обычно можно посмотреть на http://opencart.allwebstuff.info



Peer authentication failed for user “postgres”

При разворачивании проекта на руби возникла ошибка: Peer authentication failed for user “postgres”. После недолгого гугления выяснилось, что приложение пытается подключаться к базе данных, используя логин и пароль, и не обращает внимание на то, что в настройках бд выставлено подключение в положение "peer"- не требующее вводить пароль при подключении, а проверяющее права пользователя операционной системы.

Создание контроллера и шаблона на opencart 2

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


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

Александр - 24.10.2015 06:33:32
- 0    + 0
Спасибо! Настроил урлы без вложений, все работает как часы!))
Александр - 25.10.2015 18:20:10
- 0    + 0
Можно ли как-то сделать автоматический транслит в латиницу в чпу-поле при сохранении страницы товара и каталога в админке?
Александр - 25.10.2015 18:22:43
- 0    + 0
Например чтобы при сохранении страницы товара поле для указания чпу автоматически заполнялось переводом заголовка в латиницу
Александр - 25.10.2015 18:41:12
- 0    + 0
Кстати, хлебные крошки у товаров нарушились
Илья - 26.10.2015 01:51:07
- 0    + 0
Автотранслит в латиницу- это уже слишком глубокая переделка. Для этого лучше заюзать какой-нибудь плагин. Либо как минимум свои переделки оформлять в vqmod плагин.
Хлебные крошки не поломались: "Это не баг, это фича" © Стив Джобс.
Если без всех этих изменений перейти в товар, сразу по короткому имени, например из модуля "рекомендуемые товары" на главной странице, крошки будут работать точно так же.
Александр - 29.10.2015 19:03:46
- 0    + 0
Нужен какой-то модуль или как сделать страницы с фильтрами на отдельных чпу урлах, с возможностью прописать им метатеги. Для версий 1,5 есть решение модуль filterPro. Для версии 2 ничего нет ((
Илья - 30.10.2015 01:44:21
- 0    + 0
К сожалению аналога filterPro для opencart2x до сих пор не нашел. Посоветовать ничего не могу. Был проект на второй версии, там вручную делал помесь стандартного фильтра и поиска. Можно было выбрать категорию и некоторые атрибуты для фильтрации товаров. Но до возможностей фильтрпро было очень далеко...
mmm - 03.11.2015 12:59:49
- 0    + 0
ВСЁ работает, спасибо
mmm - 03.11.2015 14:02:26
- 0    + 0
Заметил такую особенность ?!
Когда заходишь через каталог-> подкаталог... -> страница товара
На страничке товара теперь под шапкой есть только название товара
к примеру "автокресло беби 15".
И чтобы мне посмотреть другие автокресло, нужно заново нажимать
"каталог" -> автокресла -> категория 1+...->
Скажем так совсем неудобно стало,
возможно ли вернуть быструю навигацию по подкатегориям
Илья - 03.11.2015 14:50:33
- 0    + 0
Да, возможно, в ближайший выходной попробую написать инструкцию.
Основная проблема в том, что хлебные крошки строятся по url адресу, а не реальному предку элемента, например можно вообще построить ссылку вида: http://ваш_сайт.ру/булки_с_маком/макбук
И хлебные крошки действительно засунут макбук в категорию "булки с маком".
mmm - 03.11.2015 16:17:31
- 0    + 0
Спасибо буду ждать
mmm - 03.11.2015 18:49:49
- 0    + 0
пока вернул все как было, чтобы была удобная навигация
Илья - 05.11.2015 05:36:35
- 0    + 0
Привет, чтото не могу понять что изменили в этих строках

Меняем в нём строчку:

'href' => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
На

'href' =>$this->url->link('product/product', '&product_id=' . $result['product_id'])
Илья - 05.11.2015 05:39:57
- 0    + 0
Упс..удалите плиз пост выше, затупил чуть
Евгений - 28.03.2016 06:58:53
- 0    + 0
Илья, добрый день!
Получилось настроить более правильное чпу ? с категориями.
чтобы было http://ваш_сайт.ру/булки_с_маком/макбук , а не просто http://ваш_сайт.ру/макбук ? Действительно неудобно потом заново выбирать категории, чтобы дойти до товаров в ней.
Илья - 01.04.2016 10:59:26
- 0    + 0
Евгений, тут проблема не в именно чпу, оно работает отлично. Проблему нужно отнести либо как к хлебным крошкам, т.к они строятся на основе чпу, а не на основе реально иерархии объектов, так и к сразу всем модулям и страницам, так как они в разных местах строят разные ссылки. Например модуль "Рекомендуемые" выставляет всегда только короткую ссылку на товар, категории нормальную, с вложения. Итд. И я не вижу простого пути победить эту проблему.
Иван - 01.04.2016 08:56:21
- 0    + 0
Спасибо, полезно:)