Всё о web

Для чайников и не только


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

Октябрь 24, 2015

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



Комментарии

17 комментариев | “Переделываем чпу opencart

  1. Аватар Александр:

    Спасибо! Настроил урлы без вложений, все работает как часы!))

  2. Аватар Александр:

    Можно ли как-то сделать автоматический транслит в латиницу в чпу-поле при сохранении страницы товара и каталога в админке?

  3. Аватар Александр:

    Например чтобы при сохранении страницы товара поле для указания чпу автоматически заполнялось переводом заголовка в латиницу

  4. Аватар Александр:

    Кстати, хлебные крошки у товаров нарушились

    1. Илья Илья:

      Автотранслит в латиницу- это уже слишком глубокая переделка. Для этого лучше заюзать какой-нибудь плагин. Либо как минимум свои переделки оформлять в vqmod плагин.
      Хлебные крошки не поломались: «Это не баг, это фича» © Стив Джобс.
      Если без всех этих изменений перейти в товар, сразу по короткому имени, например из модуля «рекомендуемые товары» на главной странице, крошки будут работать точно так же.

  5. Аватар Александр:

    Нужен какой-то модуль или как сделать страницы с фильтрами на отдельных чпу урлах, с возможностью прописать им метатеги. Для версий 1,5 есть решение модуль filterPro. Для версии 2 ничего нет ((

  6. Илья Илья:

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

  7. Аватар mmm:

    ВСЁ работает, спасибо

  8. Аватар mmm:

    Заметил такую особенность ?!
    Когда заходишь через каталог-> подкаталог… -> страница товара
    На страничке товара теперь под шапкой есть только название товара
    к примеру «автокресло беби 15».
    И чтобы мне посмотреть другие автокресло, нужно заново нажимать
    «каталог» -> автокресла -> категория 1+…->
    Скажем так совсем неудобно стало,
    возможно ли вернуть быструю навигацию по подкатегориям

  9. Илья Илья:

    Да, возможно, в ближайший выходной попробую написать инструкцию.
    Основная проблема в том, что хлебные крошки строятся по url адресу, а не реальному предку элемента, например можно вообще построить ссылку вида: http://ваш_сайт.ру/булки_с_маком/макбук
    И хлебные крошки действительно засунут макбук в категорию «булки с маком».

  10. Аватар mmm:

    Спасибо буду ждать

  11. Аватар mmm:

    пока вернул все как было, чтобы была удобная навигация

  12. Привет, чтото не могу понять что изменили в этих строках

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

    ‘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’])

  13. Упс..удалите плиз пост выше, затупил чуть

  14. Аватар Евгений:

    Илья, добрый день!
    Получилось настроить более правильное чпу ? с категориями.
    чтобы было http://ваш_сайт.ру/булки_с_маком/макбук , а не просто http://ваш_сайт.ру/макбук ? Действительно неудобно потом заново выбирать категории, чтобы дойти до товаров в ней.

    1. Илья Илья:

      Евгений, тут проблема не в именно чпу, оно работает отлично. Проблему нужно отнести либо как к хлебным крошкам, т.к они строятся на основе чпу, а не на основе реально иерархии объектов, так и к сразу всем модулям и страницам, так как они в разных местах строят разные ссылки. Например модуль «Рекомендуемые» выставляет всегда только короткую ссылку на товар, категории нормальную, с вложения. Итд. И я не вижу простого пути победить эту проблему.

  15. Спасибо, полезно:)

Comments are closed.