Перейти к содержанию
View in the app

A better way to browse. Learn more.

Русскоязычное сообщество Opencart

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

В связи с блокировкой банка QIWI оплата через сайт не возможна.
Для оплаты и получения дополнений просьба писать в личные сообщения 
Admin*у
или в Телеграмм https://t.me/pascha_opencart
После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

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

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

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

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

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

Опубликовано
  • Автор
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
				);

 

Последние посетители 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.