Избавляемся от дублей в OpenCart / Песочница / Хабрахабр


 
16 июня 2013 в 11:24

Избавляемся от дублей в OpenCart

На днях мне поставили задачу запустить в кратчайшие сроки интернет-магазин. Я начал искать подходящее решение среди готовых CMS и мой выбор пал на OpenCart (Версия 1.5.5.1). Данная CMS как и все не идеальна и поэтому я начал ковырять ее и изучать как там все устроено.



Первое что я заметил это куча дублей при включенном ЧПУ. Проблема дублей товаров решается при помощи тега rel='canonical' а вот с категориями дело обстояло намного хуже. Каждая категория была доступна по +100500 URL.  

Например категория site.ru/category/podcategory будет доступна по следующим URL

site.ru/category/podcategory/a

site.ru/category/podcategory/ab

site.ru/category/podcategory/abc

и так до бесконечности.



Решается проблема не сложно.

Открываем файл catalog/controller/common/seo_url.php ищем 39 строку $this->request->get['route'] = 'error/not_found'; и после ее вставляем

return $this->forward($this->request->get['route']);


Вот исправленный файл целиком



Эта проблема возникала из-за того что URI /category/podcategory/abc разбивался на массив и при обходе его циклом, каждый элемент массива проверялся, при помощи запроса к БД, соответствует ли он категории или продукту, если нет то для get['route'] присваивалось значение error/not_found .



В нашем случае при первой итерации цикла get['path'] будет присваиваться ID категории «category», при второй итерации get['path'] будет перезаписываться на ID категории «podcategory» при третей итерации get['route'] присваивалось значение error/not_found потому что продукта abc не существует.



Все выглядит хорошо, но в следующем блоке if-ов get['route'] перезаписывается на product/category . Это происходит из-за того что у нас есть get['path'] соответствующее ID категории, что позволяет зайти под условие и перезаписать get['route'] .



Данную проблему я решил тем что, возвращаю return $this->forward($this->request->get['route']); сразу же после того как get['route'] станет равным error/not_found не дожидаясь пока она перезапишется.



Хоть проблема дублей товаров и решается тегом rel='canonical', но все же данное изменение позволяет избавиться от большинства и остается только несколько.

Теперь товар не будет доступен по таким URL:

site.ru/category/podcategory123/tovar

site.ru/category/podcategory123456/tovar

site.ru/category123/podcategory/tovar

и так далее.

ЧИТАЙТЕ ТАКЖЕ:  Установка vqmod на OpenCart | записки кодера

http://habrahabr.ru/sandbox/65278/

Губарь Маргарита Александровна