Дубли страниц в Opencart

категория: , Дорабатываем, Должно быть


Опубликовано: 31.05.2015 Обновлено: 22.08.2015 Просмотров: 10696 Комментарии: 21


Дубли страниц в Opencart

В CMS Opencart очень много есть преимуществ перед аналогами. Однако эта система имеет и свои недостатки. Самым серьезным из которых, как я считаю, являются – дубли страниц.


В 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

Спасибо! Вроде такая мелочь в друпале, а здесь целая проблема.
Администратор

Ответ for-opencart.com 31.05.2015

Да проблема существует, либо воспользуйтесь моим дополнением xml файл просто загружаем в папку vqmod/xml либо в настройках магазина надо включить SEO PRO это для ocstore — русской сборке opencart. Дополнение предназначено для оригинального opencart где нет SEO PRO

Фото комментатора

Анна 31.05.2015

Как убрать дубли главной страницы?
Администратор

Ответ for-opencart.com 31.05.2015

Дубли главной страницы — материал пока не готов. Дам ответ немного позже.

Фото комментатора

Anton 31.05.2015

Спасибо большое за статью! Подскажите еще, пожалуйста, как убрать дубли со страницы категорий, ибо с разных категорий на один и тот же товар переходит разными ссылками. Заранее благодарен!
Администратор

Ответ for-opencart.com 31.05.2015

1. Если у Вас ocStore:

Ставим в настройках SEO PRO и в товаре выбираем главную категорию.

2. Если чистый Opencart:

Ставим мой модуль и пробуем.

Фото комментатора

Сергей 31.05.2015

Спасибо огромное! Очень нужное дело сделали. Пиво с меня !)) Еще раз спасибо.
Фото комментатора

Алексей 12.06.2015

Не вижу где можно скачать xml файл?
Администратор

Ответ for-opencart.com 12.06.2015

Просим прощения, сайт переносим, файл выслал на почту!

Фото комментатора

AKirGen 22.08.2015

Спасибо Вам за труды! Один вопрос: достаточно ли разместить xml модуль или перед этим необходимо выполнить все перечисленные правки?
Администратор

Ответ for-opencart.com 22.08.2015

Пожалуйста, достаточно просто загрузить xml файл в папку vqmod/xml и должно все работать как надо!

Фото комментатора

Евгений 22.08.2015

Добрый день! Вышлите пожалуйста файл xml против дублей страниц! Спасибо!
Администратор

Ответ for-opencart.com 22.08.2015

Добавил! Скачать модуль

Фото комментатора

Дмитрий 24.08.2015

Добрый день! Установил VQmod загрузил ваш файл, при переходе на любую страницу ошибка 404! Сео Про включено сборка Opencart 2.0.1.0 В чем может быть проблема?
Администратор

Ответ for-opencart.com 24.08.2015

Удалите xml - он для версии 1.5 - 1.6 Для 2 версии пока не готово но в планах есть сделать.

Фото комментатора

Давид 05.09.2015

Отличная статья! Спасибо большое за такое подробное описание!!
Администратор

Ответ for-opencart.com 05.09.2015

Пожалуйста, заходите на сайт и подписывайтесь в группу :)

Фото комментатора

Михаил 07.10.2015

Здравствуйте. А у меня Opencart 1.5.6.4. Но нет папки Xml в папке VQmod
Администратор

Ответ for-opencart.com 07.10.2015

Странно, но если это так, видимо не до конца как-то установился vqmod - скачайте его по ссылке и установите.

  1. Скачиваем Архив vqmod по ссылке;
  2. Загружаем папку vqmod на сервер;
  3. Переходим по адресу http://site.com/vqmod/install

После этого все что надо должно утсановится и в папку xml можно кидать мой модуль удаления дублей.

Фото комментатора

Игорь 16.10.2015

Добрый вечер! Положил ваш файлик в vqmod/xml. Разницы не почувствовал(( У меня Opencart 1.5.5.1 Что может быть не так?
Администратор

Ответ for-opencart.com 16.10.2015

Добрый день, если у Вас чистый Opencart а не ocStore тогда должно все работать. Для ocStore это не надо т.к. там можно поставить seo_pro и будет без дублей. Попробуйте очистить кеш vqmod/vqchache и system/cache

Фото комментатора

Андрей 17.11.2015

Все получилось как надо, только Страница производителя не работает.
Администратор

Ответ for-opencart.com 17.11.2015

Есть дубли со страницы товаров производителя? Посмотрите по коду, возможно ошиблись. Или выдает ошибки?

Фото комментатора

kwakin 30.11.2015

а если я seo pro поставлю на opencart то уже не надо будет делать что в статье описано ?
Администратор

Ответ for-opencart.com 30.11.2015

Да, seo_pro решает эту проблему

Фото комментатора

Андрей 21.12.2015

Не учитывает подкатегории, как решить проблему ?
Администратор

Ответ for-opencart.com 21.12.2015

Почему не учитывает? Подкатегории учитываются. Может товар в разных категориях в т.ч. и родительской.

Фото комментатора

Соловьев Алексей 06.01.2016

Добрый день, а если сделал все по инструкции, вручную все попрописывал - нужно ли устанавливать модуль XML?
Администратор

Ответ for-opencart.com 06.01.2016

Добрый день, нет, если все сделано вручную xml не нужен.

Фото комментатора

Гурам 25.01.2016

"Не учитывает подкатегории, как решить проблему ? ответ for-opencart: Почему не учитывает? Подкатегории учитываются. Может товар в разных категориях в т.ч. и родительской." Добрый день, спасибо большое. Но я удалил связь с родительской категорией, чтобы учитывало подкатегории. Но теперь при переходе в родительскую категорию отсутствуют товары, как решить данную проблему? Прощу помочь.
Администратор

Ответ for-opencart.com 25.01.2016

Разве что переписать код выборки категорий товара.

Фото комментатора

Вадим 01.02.2016

Огромное спасибо за модуль. Все дубли исчезли, кроме той ситуации когда ищешь товар через поиск и не жмешь на кнопку поиска, а выбираешь товар из выпадающего списка. Как можно исправить эту ситуацию? И еще вопрос: в панели Яндекс.Вебмастер никак не изменилось количество исключенных страниц, а ведь с исчезновением дублей ситуация должна поменяться? Или я что-то не правильно понимаю?
Администратор

Ответ for-opencart.com 01.02.2016

Пожалуйста. Для удаления дублей там - надо добавить код формирования href в живой поиск.

Исключенные страницы и дубли это разные вещи.

Фото комментатора

Вадим 02.02.2016

А можете подробней написать как добавить код формирования href в живой поиск (я просто чайник)? Как можно проверить что поисковики убрали дубли из индексации?
Администратор

Ответ for-opencart.com 02.02.2016

Не подскажу, сейчас нет времени. Они есть разные, по аналогии делайте как в статье описано для разных блоков.

Фото комментатора

Лариса 26.10.2016

Все прописала как указано в коде , а сайт вообще отключили....((
Администратор

Ответ for-opencart.com 26.10.2016

Смотрите на ту ли версию делали изменения и правильно ли их сделали.

Фото комментатора

Вячеслав 17.05.2017

Спасибо за толковую статью! Всё работает.
Администратор

Ответ for-opencart.com 17.05.2017

Благодарю!

Фото комментатора

Андрей 14.06.2017

Все отлично. но вот с Страница производителя. не находит строки 'href' => $this->url->link('product/manufacturer/info',и т.д. у самого в коде 'href' => $this->url->link('product/manufacturer/product', 'manufacturer_id=' . $result['manufacturer_id']) вот только такая. Подскажите как исправить косяк. Спасибо.
Администратор

Ответ for-opencart.com 14.06.2017

Стратья устарела - рекомендую юзать сео про

Быстрый поиск

Похожее

Новое на сайте