Перейти к содержанию
  • В связи с блокировкой банка QIWI оплата через сайт не возможна.
    Для оплаты и получения дополнений просьба писать в личные сообщения
    Admin*у
    После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

Удаляем дубли страниц в 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

 

Ссылка на комментарий
  • 1 год спустя...
1 час назад, Shoten сказал:

Подскажите пожалуйста, вы  пишете: 

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

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

Это значит эту строчку надо вставить в начало файла?

это значит что вставить данный код к примеру до или после
 

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

 

Ссылка на комментарий
  • 4 месяца спустя...

Добрый день. Почему-то не удается на странице производителей вывести ссылку, товары в категориях после изменений имеют ссылку site.ru. Opencart 3.0.3.8

Изменения в контроллере. которые я внес

Вверху в контроллере 

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

Далее ниже

foreach ($results as $result) {
			if (is_numeric(utf8_substr($result['name'], 0, 1))) {
				$key = '0 - 9';
			} else {
				$key = utf8_substr(utf8_strtoupper($result['name']), 0, 1);
			}

			if (!isset($data['categories'][$key])) {
				$data['categories'][$key]['name'] = $key;
			}
			$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']);
			}
			$data['categories'][$key]['manufacturer'][] = array(
				'name' => $result['name'],
				'href' => $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $result['manufacturer_id'])
			);
		}

href

$data['products'][] = array(
					'product_id'  => $result['product_id'],
					'thumb'       => $image,
					'name'        => $result['name'],
					'description' => utf8_substr(trim(strip_tags(html_entity_decode($result['description'], ENT_QUOTES, 'UTF-8'))), 0, $this->config->get('theme_' . $this->config->get('config_theme') . '_product_description_length')) . '..',
					'price'       => $price,
					'special'     => $special,
					'tax'         => $tax,
					'minimum'     => $result['minimum'] > 0 ? $result['minimum'] : 1,
					'rating'      => $result['rating'],
					'href'    	 => $href
				);

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...