категория: , Дорабатываем, Должно быть
✎ Опубликовано: 31.05.2015 ✎ Обновлено: 22.08.2015 ☕ Просмотров: 19573 ✉ Комментарии: 23
В CMS Opencart очень много есть преимуществ перед аналогами. Однако эта система имеет и свои недостатки. Самым серьезным из которых, как я считаю, являются – дубли страниц.
В CMS Opencart очень много есть преимуществ перед аналогами. Это простота кода, множество шаблонов, модулей, великолепное сообщество, где с вероятностью до 80% (мое мнение) можно найти нужную информацию или доработку. Однако эта система имеет и свои недостатки. Самым серьезным из которых, как я считаю, являются – дубли страниц.
Почему он самый страшный – да потому что из-за повторяющегося контента на сайте поисковые системы, мягко говоря, не в восторге. Индексировать ваш сайт они будут, но на каких местах в выдаче вы будете — это уже вопрос.
Что такое дубли страниц? Это одинаковый контент на сайте, который доступен по разным адресам. Например, карточка товара «Ноутбук Asus» доступна по адресу сайт/ноутбуки/для работы/Ноутбук-Asus. Но в случае, если вы настроите модуль рекомендуемые, новинки или другой подобный модуль, который есть с коробки в Opencart, вы получите целую дюжину дублей на сайте. Уверяю, что в выдаче вы просядете, не факт опять же, но вероятность огромная. Любой из модулей вывода товаров генерирует неправильную “Прямую” ссылку вида сайт/Ноутбук-Asus производя при этом разные адреса для одной и той же страницы.
Еще мне не понятно, зачем делать ссылку в хлебных крошках на главную страницу вида сайт/index.php?route=common/home, если намного проще ставить тот же слеш «/» и получилась бы та же ссылка без лишних параметров, которые совершенно не нужны. Та же проблема есть при переходе на главную страницу кликая на логотип.
Итак, подытожим и опишем список всех дублей в Opencart:
Как же избавиться от неправильных ссылок, которые плодят дубли на сайте?
Самый простой вариант, но не совсем правильный, это поставить в админке в настройках «ЧПУ товаров с категориями» в положение нет. В таком случае в адресах страниц у нас не будет иерархии вложенности. Такой вариант еще подходит для магазинов, которым специально нужны короткие ссылки на товар, без соблюдения категорий.
Но по правилам хорошего тона для поисковых систем, как и для людей, удобнее будет использовать 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
Открываем контроллер (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
Открываем контроллер (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
Открываем контроллер (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
Статья в разработке, как убрать дубли на главной и в хлебных крошках. Следите за обновлениями.
Добавил! Скачать модуль
Странно, но если это так, видимо не до конца как-то установился vqmod - скачайте его по ссылке и установите.
После этого все что надо должно утсановится и в папку xml можно кидать мой модуль удаления дублей.
Часто бывает, что продаваемый товар в интернет магазине не нуждается в отдельной странице. Вот как, например, гвозди. Им не надо отдельная страница
Бывают случаи, когда в списке товаров нужно кроме основного изображения вывести и дополнительные. Например, интернет-магазин фейерверков.
В стандартной реализации Opencart не предусмотрен вывод производителя товара в категории, но в некоторых ситуациях он просто необходим.
В Opencart есть возможность закачки файлов через админку. Однако сделано это очень неудобно и дает возможность скачивать файл только с личного кабинета покупателя
Список для проверки программисту перед сдачей проекта и заказчику перед тем как принять проект у исполнителя. Все что должно быть в качественном магазине
Читая информацию о рекламе в facebook я нашел кое что интересное
Чистый и валидный HTML и CSS код, Хорошие показатели Google Page Speed, Более 20 модулей в комплекте, Профессиональная техническая поддержка - это только часть того что есть в шаблоне
Исправляем странный баг в Opencart в удаляется товар при копировании. Этот баг присутствует в google chrome
Также в статье хочу выразить благодарность не только Виталию а и другим крутым авторам дополнений с кем приходилось иметь дело
Чтобы принимать Биткоин и Лайткоин в OpenCart, вам не нужно заполнять утомительные документы, проходить проверку и ждать несколько дней. Установите бесплатный модуль и просто введите адрес своего Биткоин и/или Лайткоин кошелька. Тогда все входящие платежи
Монобанк - прогрессивный банк без отделений в котором дают кредитные карточки с хорошим грейс периодом а также возможностью заработать открыв в нем депозит. Именно о нем и пойдет речь
Мы знаем что поисковые роботы любят текст на страницах. Однако публикуя тексты помните предназначена ли эта страница для такого текста
Небольшой пример как можно сделать автоматически содержание описания со скролом при клике на заголовок
Обзор платежного шлюза fondy который позволяет сделать онлайн оплату на сайте за любые товары или услуги
Как оптимизировать сайт для google page speed - обзор основного функционала сервиса от гугл для проверки скорости загрузки страницы
Для того что бы вывести кастомную информацию не надо много кода. Достаточно применить правильный подход и пару строк кода. Читаем в статье.
Как мне "посчастливилось" пощупать UMI CMS особенно со стороны переноса данных и почему меня до сих пор тошнит при слове UMI
В этом обзоре будут выявлены все плюсы и минусы каждого фильтра. Всего в обзоре будет 7 фильтров который продаются и развиваются. По завершению будет дана рекомендация какой же выбрать
Коллеги, давайте предоставлять хороший сервис и поднимать планку качества. Небольшая история как я обращался к разным разработчикам