Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

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


 Поделиться

Рекомендованные сообщения

Избавляемся от дублей в 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
и так далее.
Избавляемся от дублей в 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
и так далее.

Материл взят с сайта http://habrahabr.ru, ссылка на статью http://habrahabr.ru/sandbox/65278/

Ссылка на комментарий
Поделиться на других сайтах


  • 8 месяцев спустя...

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.