В 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
Статья в разработке, как убрать дубли на главной и в хлебных крошках. Следите за обновлениями.
Рекомендуем использовать обезличенные данные. Мы используем файлы cookie для вашего удобства пользования сайтом и повышения качества рекомендаций. Подробнее