В CMS Opencart очень много есть преимуществ перед аналогами. Это простота кода, множество шаблонов, модулей, великолепное сообщество, где с вероятностью до 80% (мое мнение) можно найти нужную информацию или доработку. Однако эта система имеет и свои недостатки. Самым серьезным из которых, как я считаю, являются – дубли страниц.

Почему он самый страшный – да потому что из-за повторяющегося контента на сайте поисковые системы, мягко говоря, не в восторге. Индексировать ваш сайт они будут, но на каких местах в выдаче вы будете — это уже вопрос.

Что такое дубли страниц? Это одинаковый контент на сайте, который доступен по разным адресам. Например, карточка товара «Ноутбук Asus» доступна по адресу сайт/ноутбуки/для работы/Ноутбук-Asus. Но в случае, если вы настроите модуль рекомендуемые, новинки или другой подобный модуль, который есть с коробки в Opencart, вы получите целую дюжину дублей на сайте. Уверяю, что в выдаче вы просядете, не факт опять же, но вероятность огромная. Любой из модулей вывода товаров генерирует неправильную “Прямую” ссылку вида сайт/Ноутбук-Asus производя при этом разные адреса для одной и той же страницы.

Еще мне не понятно, зачем делать ссылку в хлебных крошках на главную страницу вида сайт/index.php?route=common/home, если намного проще ставить тот же слеш «/» и получилась бы та же ссылка без лишних параметров, которые совершенно не нужны. Та же проблема есть при переходе на главную страницу кликая на логотип.

Итак, подытожим и опишем список всех дублей в Opencart:

  • Доступность одного товара по разным адресам. (модули последние, рекомендуемые и т.д.)
  • Ссылки на главную в виде сайт/index.php?route=common/homе
  • Доступность главной страницы сайта по адресам
    — http://сайт
    — http://сайт/
    — http://сайт/index.php
    — http://сайт/index.php?route=common/homе



  • Ссылки при пейджинге страницы (как следствие одинаковые мета теги и описание категории, чего лучше не допускать)
  • Другие (исследую)

Как же избавиться от неправильных ссылок, которые плодят дубли на сайте?

Самый простой вариант, но не совсем правильный, это поставить в админке в настройках «ЧПУ товаров с категориями» в положение нет. В таком случае в адресах страниц у нас не будет иерархии вложенности. Такой вариант еще подходит для магазинов, которым специально нужны короткие ссылки на товар, без соблюдения категорий.

Но по правилам хорошего тона для поисковых систем, как и для людей, удобнее будет использовать URL с соблюдением вложенности (иерархии).

Для удаления разных адресов на один и тот же товар нам нужно внести поправки в модулях и местах, которые генерируют «прямые» ссылки. Из модулей будем редактировать: Хиты продаж, Рeкомендуемые, Последние и Aкции. Все эти модули есть в стандартной комплектации Opencart и OcStore. Для полноценного избавления нам надо будет отредактировать еще места неправильных ссылок: страница производителя, блок рекомендуемых в описании товара, страница акций (product/special), страница с результатами поска, страница сравнения товаров.

В выше перечисленных модулях не предусмотрена ссылка с учетом категории, в котором находится товар, нам же надо её сделать, да и еще с соблюденной иерархией категорий. В моем методе можно получить ссылки с уровнем вложенности до 5 — чего для 95% магазинов хватит.

Для определения категории товара нам надо добавить функцию в 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; } 

Далее переходим в контроллер нужного нам модуля и делаем изменения в URL с учетом категории товара.

Итак по модулям:

Хиты продаж

Открываем контроллер (catalog/controller/module/bestseller.php)

В начало функции подключаем модель:

$this->load->model('catalog/category'); 

Перед

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']); } 

И строку

'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) 

Заменяем на:

'href' => $href 

Pекомендуемые

Открываем контроллер (catalog/controller/module/featured.php)

В начало функции подключаем модель:

$this->load->model('catalog/category'); 

Перед

if ($product_info['image']) {

Вставляем

$product_path = $this->model_catalog_category->getProductPath($product_id); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $product_info['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $product_info['product_id']); } 

И строку

'href' => $this->url->link('product/product', 'product_id=' . $product_info['product_id']) 

Заменяем на:

'href' => $href 

Последние товары

Открываем контроллер (catalog/controller/module/latest.php)

В начало функции подключаем модель:

$this->load->model('catalog/category'); 

Перед

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']); } 

И строку

'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) 

Заменяем на:

'href' => $href 

Aкции

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

В начало функции подключаем модель:

$this->load->model('catalog/category'); 

Перед

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']); } 

И строку

'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) 

Заменяем на:

'href' => $href 

Стандартные модули в Opencart мы избавили от возможности генерировать дубли страниц в магазине. Далее переходим на отдельные места, где неправильные ссылки.

Страница производителя

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

В начало функции подключаем модель:

$this->load->model('catalog/category'); 

Перед

$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']); } 

И строку

'href' => $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $result['manufacturer_id']) 

Заменяем на:

'href' => $href 

Блок рекомендуемых на странице товара

Открываем контроллер (catalog/controller/product/product.php)

Перед

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']); } 

И строку

'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) 

Заменяем на:

'href' => $href 

Страница акций(product/special)

Открываем контроллер (catalog/controller/product/special.php)

В начало функции подключаем модель:

$this->load->model('catalog/category'); 

Перед

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']); } 

И строку

'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) 

Заменяем на:

'href' => $href 

Страница результатов поиска

Открываем контроллер (catalog/controller/product/search.php)

В начало функции подключаем модель:

$this->load->model('catalog/category'); 

Перед

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']); } 

И строку

'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) 

Заменяем на:

'href' => $href 

Страница сравнения товаров

Открываем контроллер (catalog/controller/product/compare.php)

В начало функции подключаем модель:

$this->load->model('catalog/category'); 

Перед

if ($product_info['image']) {

Вставляем

$product_path = $this->model_catalog_category->getProductPath($product_info['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $product_info['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $product_info['product_id']); } 

И строку

'href' => $this->url->link('product/product', 'product_id=' . $product_info['product_id']) 

Заменяем на:

'href' => $href 

Статья в разработке, как убрать дубли на главной и в хлебных крошках. Следите за обновлениями.


31.05.2015 19122
Новости из этой категории
20.09.2019 5850
Обзор шаблона который сделал качественный рывок в мире готовых решений - UltraStore от Octemplates
Когда мы хотим получить что-то качественное мы обращаемся к узконаправленным специалистам. Выбор шаблона это очень серьезно, особенно на старте бизнеса, да и на любом его..
02.09.2019 3273
Принимаем Биткоин и Лайткоин в OpenСart 3
CMS Opencart это всемирно известная платформа, которая позволяет быстро и бесплатно создать интернет-магазин. Она получила широкую популярность в Европейских и Азиатских ..
17.11.2017 10960
Удаление фото если они не закреплены за товаром - чистка сервера от лишних изображений
Когда в Opencart удаляется товар, фото физически остается на сервере а удаляется лишь в базе сам товар и привязка к файлу.Чем это плохо?Первое - это накопление ненужных ф..
15.11.2017 3837
Сортировка рекомендуемых товаров перетягиванием мышки
Приветствую! Сегодня хочу поделится одной доработкой которая позволяет добавить сортировку рекомендуемых товаров простым перетягиванием мышки.Для сортировки элементов в с..
21.09.2017 4980
OCMOD editor - редактирование ocmod модификаторов прямо в админке!
Представляю вам бесплатное решение, которое избавляет от головной боли в ситуации когда надо внести правки в уже установленный модификатор ocmod. Этот мод позволяет прямо..
Вся информация, представленная на сайте, является демонстрационной и оставляя информацию о своих персональных данных, вы добровольно делаете их общедоступными.
Рекомендуем использовать обезличенные данные. Мы используем файлы cookie для вашего удобства пользования сайтом и повышения качества рекомендаций. Подробнее