17 февраля 2014 г.

Недавно удалось обнаружить серьёзный недочет в работе стандартного контроллера OpenCart SEO URL. Один из заказчиков пожаловался на выпадение из поисковой выдачи целого ряда категорий и связанных с ними товаров. Владелец магазина не особо себя утруждает работой с контентом через панель администрирования, обновление данных настроено через выгрузку из базы данных популярной программы для ведения финансовой и торговой деятельности. Слишком много товаров и категорий, чтобы за ними следить вручную.

Как и ожидалось, проблемы были видны и в самом интерфейсе. Подкатегории некоторых категорий имели такие же ссылки, которые были закреплены за родительскими категориями. Если взять один из участков дерева категорий, то он выглядел следующим образом:
Мебель и предметы интерьера
http://domain.com/furniture
Мебель и предметы интерьера -> Кухонная мебель
http://domain.com/furniture
Мебель и предметы интерьера -> Кухонная мебель -> Стулья
http://domain.com/furniture
Мебель и предметы интерьера -> Кухонная мебель -> Столы
http://domain.com/furniture
Видно, что для всех категорий "заданы" одни и те же ссылки. Ни поисковый робот, ни посетители больше не могут попасть в подкатегории.

Ранее владелец магазина пытался оптимизировать структуру категорий, в том числе задать канонические имена (заполнить поля SEO URL). Начал с основных категорий, видимо в какой-то момент это дело наскучило и оптимизация была отложена (категорий было очень много).

Собственно причина была очевидна, если родительским категориям задать ссылки, а дочерние категории оставить без изменений (ссылки-идентификаторы по умолчанию), то при включенном режиме SEO URL ссылки для подкатегорий формироваться не будут.

Чтобы это исправить, в оригинальном файле ./catalog/controller/common/seo_url.php необходимо выполнить следующее:

  1. В теле функции index() найти строку foreach ($parts as $part) { и заменить на строку  foreach ($parts as $id => $part) {Ниже найти строку $this->request->get['path'] .= '_' . $url[1]; и заменить на if ($id) { $this->request->get['path'] .= '_' . $url[1]; } else { $this->request->get['path'] = $url[1] . '_' . $this->request->get['path']; }
  2. В теле функции rewrite() в условии } elseif ($key == 'path') { найти и удалить строку unset($data[$key]);Здесь же строку $url .= '/' . $query->row['keyword']; заменить на следующий код: $part = preg_replace('/^' . $category .  '_?/', '', $data[$key]); if ($data[$key] != $part) { $url .= '/' . $query->row['keyword']; if ($part) { $data[$key] = $part; } else { unset($data[$key]); } }
После такой доработки наш выделенный участок из общей структуры категорий примет следующий вид:
Мебель и предметы интерьера
http://domain.com/furniture
Мебель и предметы интерьера -> Кухонная мебель
http://domain.com/furniture?path=40
Мебель и предметы интерьера -> Кухонная мебель -> Стулья
http://domain.com/furniture?path=40_41
Мебель и предметы интерьера -> Кухонная мебель -> Столы
http://domain.com/furniture?path=40_42
Первый пункт доработки обеспечивает понимание таких ссылок, а второй их формирование. Соответствующие исправления необходимо сделать и для оптимизированной версии контроллера (для тех кто использует решение по сокращению количества запросов к базе данных в режиме SEO URL), но уже в другом виде.

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

0 comments:

Отправить комментарий

  • RSS
  • Twitter
  • Youtube