Как убрать дубли страницы в карте товара / рекомендуемых / новых товарах opencart

В общем столкнулся с проблемой, которая вредит seo, хлебным крошкам да и вообще смотрится не красиво. Нашел один способ в интернете, я его опишу но с корректировкой, так как в способе который я нашел, баг со скобками, код не очень чистый. Данный способ проверен и работает на opencart 1.5.6.1

И так:
Товар может быть доступен по следующим адресам:
сайт.ua/canon 70D — [товар открывается с главной страницы]
сайт.ua/зеркальные камеры/canon 70D — [товар открывается с категории]
сайт.ua/зеркальные камеры/royal-forest/canon 70D — [товар открывается со страницы производителя]
ну и соответственно товар открывается со всех модулей, где он выводится: Хиты продаж, Рекомендуемые, Последние, Акции и т.д.
кроме того, ссылки на товар формируются в блоке «Рекомендуемые» на странице другого товара; на странице с результатами поиска; на странице сравнения товаров

A. Начнем с того, что добавим функцию определения категории товара в файл …catalog/model/catalog/category.php.

Над строкой сверху: public function getCategoryLayoutId($category_id)

Добавляем

public function getProductPath($product_id) { $category_id = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'"); if(isset($category_id->rows[0]['category_id']) && ($category_id->rows[0]['category_id'] != 0)){ $parent_id = $this->db->query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$category_id->rows[0]['category_id'] . "'"); if(isset($parent_id->rows[0]['parent_id']) && ($parent_id->rows[0]['parent_id'] != 0)){ $category = $parent_id->rows[0]['parent_id'] . "_" . $category_id->rows[0]['category_id']; $path_id_2 = $this->db->query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . $parent_id->rows[0]['parent_id'] . "'"); if(isset($path_id_2->rows[0]['parent_id']) && ($path_id_2->rows[0]['parent_id'] != 0)){ $category = $path_id_2->rows[0]['parent_id'] . "_" . $parent_id->rows[0]['parent_id'] . "_" . $category_id->rows[0]['category_id']; $path_id_3 = $this->db->query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$path_id_2->rows[0]['parent_id'] . "'"); if(isset($path_id_3->rows[0]['parent_id']) && ($path_id_3->rows[0]['parent_id'] != 0)){ $category = $path_id_3->rows[0]['parent_id'] . "_" . $path_id_2->rows[0]['parent_id'] . "_" . $parent_id->rows[0]['parent_id'] . "_" . $category_id->rows[0]['category_id']; $path_id_4 = $this->db->query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$path_id_3->rows[0]['parent_id'] . "'"); if(isset($path_id_4->rows[0]['parent_id']) && ($path_id_4->rows[0]['parent_id'] != 0)){ $category = $path_id_4->rows[0]['parent_id'] . "_" . $path_id_3->rows[0]['parent_id'] . "_" . $path_id_2->rows[0]['parent_id'] . "_" . $parent_id->rows[0]['parent_id'] . "_" . $category_id->rows[0]['category_id']; } } } }else{ $category = $category_id->rows[0]['category_id']; } }else{ $category = false; } return $category; }


B. Далее перейдем в контроллер модуля (для примера возьмем АКЦИИ) и внесем изменения в URL товара:

1. Открываем контроллер …catalog/controller/module/special.php

После строки: protected function index($setting){

добавим: $this->load->model('catalog/category');

2. Перед:
if ($result['image']) {


вставим:
$product_path = $this->model_catalog_category->getProductPath($result['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $result['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $result['product_id']); }


3. Строку:
'href' => $this->url->link('product/product', 'product_id=' . $result['product_id'])


заменим на:
'href' => $href


Проделав все вышеперечисленное мы добились отмены генерации дублей страниц в модуле АКЦИИ. Точно так же, можно и нужно избавиться от дублей страниц в модулях РЕКОМЕНДУЕМЫЕ, ХИТЫ ПРОДАЖ, ПОСЛЕДНИЕ и всех остальных стоящих у вас в магазине. Для этого нужно повторить пункт В. в соответствующих файлах.

  • Для модуля ХИТЫ ПРОДАЖ изменяем …catalog/controller/module/bestseller.php
  • Для модуля РЕКОМЕНДУЕМЫЕ изменяем …catalog/controller/module/featured.php
  • Для модуля ПОСЛЕДНИЕ ТОВАРЫ изменяем …catalog/controller/module/latest.php
  • и т.д. по всем модулям которые у вас установлены.


Что касается страницы производителей, блока рекомендуемых на странице товара, страницы акций, страницы результатов поиска, страницы сравнения товаров — то здесь делаются такие же изменения, но в других файлах.

Начнем со страницы производителя:

A. Открываем контроллер …catalog/controller/product/manufacturer.php

  1. В начало фунции подключаем модель:
    $this->load->model('catalog/category');
  2. Перед:
    $this->data['categories'][$key]['manufacturer'][] = array(

Вставим:
$product_path = $this->model_catalog_category->getProductPath($result['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $result['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $result['product_id']); }


3. Строку:
'href' => $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $result['manufacturer_id'])


Меняем на:
'href' => $href


В результате мы избавились от дубля страницы товара в списке производителей.

Для того, чтобы убрать дубли со страницы акций нужно внести точно такие же правки в файле …catalog/controller/product/special.php

Для блока рекомендуемых на странице товара редактируем …catalog/controller/product/product.php
Для страницы результатов поиска…catalog/controller/product/search.php
Для страницы сравнения товаров…catalog/controller/product/compare.php

Статья написана Николаем Прутом, корректировки произведены AndreyART.

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
comments powered by Disqus