Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Recommended Posts

Усиновлен Opencart 1.5.4.1, SeoPro, настроены ЧПУ. Как избавиться от иких дублей:

site.ru/index.php

site.ru/index.php?

site.ru/index.php?123

site.ru/index.php?qwe

и т.д.

По всем ответ 200 ОК

Т.е. бесконечное множество дублей... как то можно от них избавиться?

Edited by imushroom
Link to comment
Share on other sites


Приветствую всех!

И у меня тоже возникла проблема с дублями, OP 2.2, seo_pro

Дубли получается вот икие

/category1/sub-category1/tovar1

/category1/tovar1

Почему seo_pro икое не обрабатывает правильно?

И как лучше всего исправить?

Link to comment
Share on other sites


Ребят помогите пожалуйси уже и не знаю что гделать!
икая беда с очень многими товарами
врогде как сео все правильно гделает
раньше икого небыло
с недавних пор иким обвместе пропадают товары
хотя в списке они есть но как заходишь в саму карточку то вот икая лабуда

dcf685a8cafe.png

Link to comment
Share on other sites


  • 4 weeks later...
Здравствуйте!

Приобреил Ваш модуль для сайи, модуль рилииет, всё отлично.

Начали строить второй сайт хотим усиновить SeoPro.

Вопрос на второй сайт модуль необходимо покупать повторно?

 Просто из описания модуля это не очевидно...  https://opencart-forum.ru/files/file/1155-модуль-управления-seopro/

 

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

 

 

 

ПС. Valogroup, мы с вами соседи по корпусу в Румянэтово :)

Link to comment
Share on other sites


Доброе время суток.

Кто нибудь решил вопрос с одинаковыми подкатегориями?

То есть структура икая:

-Бумага

--Бумага А4

--Цветная

----

-Картон

--Картон А4

--Цветной

 

У цветной и цветная - url один и тот же. Изменять нельзя!

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

Писал ик в файле catalog\controller\common\seo_pro.php:


foreach ($parts as $keyword) {

if (isset($a) && $a[0]=="category_id") {
$query = $this->db->query("SELECT a.* FROM " . DB_PREFIX . "url_alias a, " . DB_PREFIX . "category c WHERE a.keyword = '" . $this->db->escape($keyword) . "' AND a.query=CONCAT('category_id=', c.category_id) AND c.parent_id='".$a[1]."'");
if ($query->num_rows) {
$rows[] = array('keyword' => $keyword, 'query' => $query->row['query']);
$a = explode("=",$query->row['query']);
}
} else {
if (isset($this->cache_data['keywords'][$keyword])) {
$rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]);
$a=explode("=",$this->cache_data['keywords'][$keyword]);
}
}

}

 

В резульите категории сили открываться как надо, но при клике на товар - Запрашиваемая страница не найгдена.

 

Исходный код файла seo_pro.php

class ControllerCommonSeoPro extends Controller {
private $cache_data = null;
private $languages = array();
private $config_language;

public function __construct($registry) {
parent::__construct($registry);
$this->cache_data = $this->cache->get('seo_pro');
if (!$this->cache_data) {
$query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias");
$this->cache_data = array();
foreach ($query->rows as $row) {
$this->cache_data['keywords'][$row['keyword']] = $row['query'];
$this->cache_data['queries'][$row['query']] = $row['keyword'];
}
$this->cache->set('seo_pro', $this->cache_data);
}

$query = $this->db->query("SELECT `value` FROM `" . DB_PREFIX . "setting` WHERE `key` = 'config_language'");
$this->config_language = $query->row['value'];

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language WHERE status = '1'");

foreach ($query->rows as $result) {
$this->languages[$result['code']] = $result;
}

}

public function index() {

// language
$code = $this->config_language;

if(isset($this->request->get['route'])) {
$routes=explode('/',$this->request->get['route']);
}

if(isset($this->request->get['_route_'])) {

$route_ = $this->request->get['_route_'];

$tokens = explode('/', $this->request->get['_route_']);

if(array_key_exists($tokens[0], $this->languages)) {
$code = $tokens[0];
$this->request->get['_route_'] = substr($this->request->get['_route_'], strlen($code) + 1);
}

if(trim($this->request->get['_route_']) == '' || trim($this->request->get['_route_']) == 'index.php') {
unset($this->request->get['_route_']);
}
}

if ($code == $this->config_language &&
isset($this->request->cookie['language']) &&
$this->request->cookie['language'] != $code &&
isset($this->request->server['HTTP_X_REQUESTED_WITH']) &&
strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
$code = $this->request->cookie['language'];
}

if (isset($this->request->cookie['language']) &&
$this->request->cookie['language'] != $code &&
isset($routes) &&
trim($routes[0]=='module')) {
$code = $this->request->cookie['language'];
}

if(!isset($this->session->data['language']) || $this->session->data['language'] != $code) {
$this->session->data['language'] = $code;
}


$xhttprequested = isset($this->request->server['HTTP_X_REQUESTED_WITH']) && $this->request->server['HTTP_X_REQUESTED_WITH'] == 'xmlhttprequest';

$captcha = isset($this->request->get['route']) && $this->request->get['route']=='product/product/captcha';

if(!$xhttprequested && !$captcha) {
setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
}


$this->config->set('config_language_id', $this->languages[$code]['language_id']);
$this->config->set('config_language', $this->languages[$code]['code']);

$language = new Language($this->languages[$code]['directory']);
$language->load($this->languages[$code]['filename']);
$this->registry->set('language', $language);


// Add rewrite to url class
if ($this->config->get('config_seo_url')) {
$this->url->addRewrite($this);
} else {
return;
}

// Decode URL
if (!isset($this->request->get['_route_'])) {
$this->validate();
} else {
$route = $this->request->get['_route_'];
unset($this->request->get['_route_']);
$parts = explode('/', trim(utf8_strtolower($route), '/'));
list($last_part) = explode('.', array_pop($parts));
array_push($parts, $last_part);

$rows = array();
foreach ($parts as $keyword) {
if (isset($this->cache_data['keywords'][$keyword])) {
$rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]);
}
}

if (count($rows) == sizeof($parts)) {
$queries = array();
foreach ($rows as $row) {
$queries[utf8_strtolower($row['keyword'])] = $row['query'];
}

reset($parts);
foreach ($parts as $part) {
$url = explode('=', $queries[$part], 2);

if ($url[0] == 'category_id') {
if (!isset($this->request->get['path'])) {
$this->request->get['path'] = $url[1];
} else {
$this->request->get['path'] .= '_' . $url[1];
}
} elseif (count($url) > 1) {
$this->request->get[$url[0]] = $url[1];
}
}
} else {
$this->request->get['route'] = 'error/not_found';
}

if (isset($this->request->get['product_id'])) {
$this->request->get['route'] = 'product/product';
if (!isset($this->request->get['path'])) {
$path = $this->getPathByProduct($this->request->get['product_id']);
if ($path) $this->request->get['path'] = $path;
}
} elseif (isset($this->request->get['path'])) {
$this->request->get['route'] = 'product/category';
} elseif (isset($this->request->get['manufacturer_id'])) {
$this->request->get['route'] = 'product/manufacturer/product';
if(in_array(substr(VERSION, 0, 5), array('1.5.4', '1.5.5'))) {
$this->request->get['route'] = 'product/manufacturer/info';
}
} elseif (isset($this->request->get['information_id'])) {
$this->request->get['route'] = 'information/information';
} elseif(isset($this->cache_data['queries'][$route_])) {
header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
$this->response->redirect($this->cache_data['queries'][$route_]);
} else {
if (isset($queries[$parts[0]])) {
$this->request->get['route'] = $queries[$parts[0]];
}
}


$this->validate();

if (isset($this->request->get['route'])) {
return $this->forward($this->request->get['route']);
}
}
}

public function rewrite($link, $code = '') {
if(!$code) {
$code = $this->session->data['language'];
}
if (!$this->config->get('config_seo_url')) return $link;

$seo_url = '';

$component = parse_url(str_replace('&', '&', $link));

$data = array();
parse_str($component['query'], $data);

$route = $data['route'];
unset($data['route']);

switch ($route) {
case 'product/product':
if (isset($data['product_id'])) {
$tmp = $data;
$data = array();
if ($this->config->get('config_seo_url_include_path')) {
$data['path'] = $this->getPathByProduct($tmp['product_id']);
if (!$data['path']) return $link;
}
$data['product_id'] = $tmp['product_id'];
if (isset($tmp['tracking'])) {
$data['tracking'] = $tmp['tracking'];
}
}
break;

case 'product/category':
if (isset($data['path'])) {
$category = explode('_', $data['path']);
$category = end($category);
$data['path'] = $this->getPathByCategory($category);
if (!$data['path']) return $link;
}
break;

case 'product/product/review':
case 'information/information/info':
return $link;
break;

default:
break;
}

if ($component['scheme'] == 'https') {
$link = $this->config->get('config_ssl');
} else {
$link = $this->config->get('config_url');
}

if ($code != $this->config_language){
$link .= $code . '/index.php?route=' . $route;
} else{
$link .= 'index.php?route=' . $route;
}

if (count($data)) {
$link .= '&' . urldecode(http_build_query($data, '', '&'));
}

$queries = array();
foreach ($data as $key => $value) {
switch ($key) {
case 'product_id':
case 'manufacturer_id':
case 'category_id':
case 'information_id':
$queries[] = $key . '=' . $value;
unset($data[$key]);
$postfix = 1;
break;

case 'path':
$categories = explode('_', $value);
foreach ($categories as $category) {
$queries[] = 'category_id=' . $category;
}
unset($data[$key]);
break;

default:
break;
}
}

if(empty($queries)) {
$queries[] = $route;
}

$rows = array();
foreach($queries as $query) {
if(isset($this->cache_data['queries'][$query])) {
$rows[] = array('query' => $query, 'keyword' => $this->cache_data['queries'][$query]);
}
}

if(count($rows) == count($queries)) {
$aliases = array();
foreach($rows as $row) {
$aliases[$row['query']] = $row['keyword'];
}
foreach($queries as $query) {
$seo_url .= '/' . rawurlencode($aliases[$query]);
}
}

if ($seo_url == '') return $link;

if($code != $this->config_language) {
$seo_url = $code . '/' . trim($seo_url, '/');
} else {
$seo_url = trim($seo_url, '/');
}

if ($component['scheme'] == 'https') {
$seo_url = $this->config->get('config_ssl') . $seo_url;
} else {
$seo_url = $this->config->get('config_url') . $seo_url;
}

if (isset($postfix)) {
$seo_url .= trim($this->config->get('config_seo_url_postfix'));
} else {
$seo_url .= '/';
}

if(substr($seo_url, -2) == '//') {
$seo_url = substr($seo_url, 0, -1);
}


if (count($data)) {
$seo_url .= '?' . urldecode(http_build_query($data, '', '&'));
}

return $seo_url;
}

private function getPathByProduct($product_id) {
$product_id = (int)$product_id;
if ($product_id < 1) return false;

static $path = null;
if (!is_array($path)) {
$path = $this->cache->get('product.seopath');
if (!is_array($path)) $path = array();
}

if (!isset($path[$product_id])) {
$query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . $product_id . "' ORDER BY main_category DESC LIMIT 1");

$path[$product_id] = $this->getPathByCategory($query->num_rows ? (int)$query->row['category_id'] : 0);

$this->cache->set('product.seopath', $path);
}

return $path[$product_id];
}

private function getPathByCategory($category_id) {
$category_id = (int)$category_id;
if ($category_id < 1) return false;

static $path = null;
if (!is_array($path)) {
$path = $this->cache->get('category.seopath');
if (!is_array($path)) $path = array();
}

if (!isset($path[$category_id])) {
$max_level = 10;

$sql = "SELECT CONCAT_WS('_'";
for ($i = $max_level-1; $i >= 0; --$i) {
$sql .= ",t$i.category_id";
}
$sql .= ") AS path FROM " . DB_PREFIX . "category t0";
for ($i = 1; $i < $max_level; ++$i) {
$sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)";
}
$sql .= " WHERE t0.category_id = '" . $category_id . "'";

$query = $this->db->query($sql);

$path[$category_id] = $query->num_rows ? $query->row['path'] : false;

$this->cache->set('category.seopath', $path);
}

return $path[$category_id];
}

private function validate() {
if (isset($this->request->get['route']) && $this->request->get['route'] == 'error/not_found') {
return;
}
if(empty($this->request->get['route'])) {
$this->request->get['route'] = 'common/home';
}

if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
return;
}

if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
$url = str_replace('&', '&', $this->config->get('config_ssl') . ltrim($this->request->server['REQUEST_URI'], '/'));
$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'SSL'));
} else {
$url = str_replace('&', '&', $this->config->get('config_url') . ltrim($this->request->server['REQUEST_URI'], '/'));
$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'NONSSL'));
}

if (rawurldecode($url) != rawurldecode($seo)) {

header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');

$this->response->redirect($seo);
}
}

private function getQueryString($exclude = array()) {
if (!is_array($exclude)) {
$exclude = array();
}

return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude))));
}
}
?>

 

Может кто подсказать как дальше пилить? Или какое то другое решение сложившейся проблемы.

 

OC 1.5.6.4

Link to comment
Share on other sites


Доброе время суток.

Кто нибудь решил вопрос с одинаковыми подкатегориями?

То есть структура икая:

-Бумага

--Бумага А4

--Цветная

----

-Картон

--Картон А4

--Цветной

 

У цветной и цветная - url один и тот же. Изменять нельзя!

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

Писал ик в файле catalog\controller\common\seo_pro.php:

foreach ($parts as $keyword) {

if (isset($a) && $a[0]=="category_id") {

$query = $this->db->query("SELECT a.* FROM " . DB_PREFIX . "url_alias a, " . DB_PREFIX . "category c WHERE a.keyword = '" . $this->db->escape($keyword) . "' AND a.query=CONCAT('category_id=', c.category_id) AND c.parent_id='".$a[1]."'");

if ($query->num_rows) {

$rows[] = array('keyword' => $keyword, 'query' => $query->row['query']);

$a = explode("=",$query->row['query']);

}

} else {

if (isset($this->cache_data['keywords'][$keyword])) {

$rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]);

$a=explode("=",$this->cache_data['keywords'][$keyword]);

}

}

}

 

В резульите категории сили открываться как надо, но при клике на товар - Запрашиваемая страница не найгдена.

 

Исходный код файла seo_pro.php

class ControllerCommonSeoPro extends Controller {

private $cache_data = null;

private $languages = array();

private $config_language;

public function __construct($registry) {

parent::__construct($registry);

$this->cache_data = $this->cache->get('seo_pro');

if (!$this->cache_data) {

$query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias");

$this->cache_data = array();

foreach ($query->rows as $row) {

$this->cache_data['keywords'][$row['keyword']] = $row['query'];

$this->cache_data['queries'][$row['query']] = $row['keyword'];

}

$this->cache->set('seo_pro', $this->cache_data);

}

$query = $this->db->query("SELECT `value` FROM `" . DB_PREFIX . "setting` WHERE `key` = 'config_language'");

$this->config_language = $query->row['value'];

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language WHERE status = '1'");

foreach ($query->rows as $result) {

$this->languages[$result['code']] = $result;

}

}

public function index() {

// language

$code = $this->config_language;

if(isset($this->request->get['route'])) {

$routes=explode('/',$this->request->get['route']);

}

if(isset($this->request->get['_route_'])) {

$route_ = $this->request->get['_route_'];

$tokens = explode('/', $this->request->get['_route_']);

if(array_key_exists($tokens[0], $this->languages)) {

$code = $tokens[0];

$this->request->get['_route_'] = substr($this->request->get['_route_'], strlen($code) + 1);

}

if(trim($this->request->get['_route_']) == '' || trim($this->request->get['_route_']) == 'index.php') {

unset($this->request->get['_route_']);

}

}

if ($code == $this->config_language &&

isset($this->request->cookie['language']) &&

$this->request->cookie['language'] != $code &&

isset($this->request->server['HTTP_X_REQUESTED_WITH']) &&

strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {

$code = $this->request->cookie['language'];

}

if (isset($this->request->cookie['language']) &&

$this->request->cookie['language'] != $code &&

isset($routes) &&

trim($routes[0]=='module')) {

$code = $this->request->cookie['language'];

}

if(!isset($this->session->data['language']) || $this->session->data['language'] != $code) {

$this->session->data['language'] = $code;

}

$xhttprequested = isset($this->request->server['HTTP_X_REQUESTED_WITH']) && $this->request->server['HTTP_X_REQUESTED_WITH'] == 'xmlhttprequest';

$captcha = isset($this->request->get['route']) && $this->request->get['route']=='product/product/captcha';

if(!$xhttprequested && !$captcha) {

setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);

}

$this->config->set('config_language_id', $this->languages[$code]['language_id']);

$this->config->set('config_language', $this->languages[$code]['code']);

$language = new Language($this->languages[$code]['directory']);

$language->load($this->languages[$code]['filename']);

$this->registry->set('language', $language);

// Add rewrite to url class

if ($this->config->get('config_seo_url')) {

$this->url->addRewrite($this);

} else {

return;

}

// Decode URL

if (!isset($this->request->get['_route_'])) {

$this->validate();

} else {

$route = $this->request->get['_route_'];

unset($this->request->get['_route_']);

$parts = explode('/', trim(utf8_strtolower($route), '/'));

list($last_part) = explode('.', array_pop($parts));

array_push($parts, $last_part);

$rows = array();

foreach ($parts as $keyword) {

if (isset($this->cache_data['keywords'][$keyword])) {

$rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]);

}

}

if (count($rows) == sizeof($parts)) {

$queries = array();

foreach ($rows as $row) {

$queries[utf8_strtolower($row['keyword'])] = $row['query'];

}

reset($parts);

foreach ($parts as $part) {

$url = explode('=', $queries[$part], 2);

if ($url[0] == 'category_id') {

if (!isset($this->request->get['path'])) {

$this->request->get['path'] = $url[1];

} else {

$this->request->get['path'] .= '_' . $url[1];

}

} elseif (count($url) > 1) {

$this->request->get[$url[0]] = $url[1];

}

}

} else {

$this->request->get['route'] = 'error/not_found';

}

if (isset($this->request->get['product_id'])) {

$this->request->get['route'] = 'product/product';

if (!isset($this->request->get['path'])) {

$path = $this->getPathByProduct($this->request->get['product_id']);

if ($path) $this->request->get['path'] = $path;

}

} elseif (isset($this->request->get['path'])) {

$this->request->get['route'] = 'product/category';

} elseif (isset($this->request->get['manufacturer_id'])) {

$this->request->get['route'] = 'product/manufacturer/product';

if(in_array(substr(VERSION, 0, 5), array('1.5.4', '1.5.5'))) {

$this->request->get['route'] = 'product/manufacturer/info';

}

} elseif (isset($this->request->get['information_id'])) {

$this->request->get['route'] = 'information/information';

} elseif(isset($this->cache_data['queries'][$route_])) {

header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');

$this->response->redirect($this->cache_data['queries'][$route_]);

} else {

if (isset($queries[$parts[0]])) {

$this->request->get['route'] = $queries[$parts[0]];

}

}

$this->validate();

if (isset($this->request->get['route'])) {

return $this->forward($this->request->get['route']);

}

}

}

public function rewrite($link, $code = '') {

if(!$code) {

$code = $this->session->data['language'];

}

if (!$this->config->get('config_seo_url')) return $link;

$seo_url = '';

$component = parse_url(str_replace('&', '&', $link));

$data = array();

parse_str($component['query'], $data);

$route = $data['route'];

unset($data['route']);

switch ($route) {

case 'product/product':

if (isset($data['product_id'])) {

$tmp = $data;

$data = array();

if ($this->config->get('config_seo_url_include_path')) {

$data['path'] = $this->getPathByProduct($tmp['product_id']);

if (!$data['path']) return $link;

}

$data['product_id'] = $tmp['product_id'];

if (isset($tmp['tracking'])) {

$data['tracking'] = $tmp['tracking'];

}

}

break;

case 'product/category':

if (isset($data['path'])) {

$category = explode('_', $data['path']);

$category = end($category);

$data['path'] = $this->getPathByCategory($category);

if (!$data['path']) return $link;

}

break;

case 'product/product/review':

case 'information/information/info':

return $link;

break;

default:

break;

}

if ($component['scheme'] == 'https') {

$link = $this->config->get('config_ssl');

} else {

$link = $this->config->get('config_url');

}

if ($code != $this->config_language){

$link .= $code . '/index.php?route=' . $route;

} else{

$link .= 'index.php?route=' . $route;

}

if (count($data)) {

$link .= '&' . urldecode(http_build_query($data, '', '&'));

}

$queries = array();

foreach ($data as $key => $value) {

switch ($key) {

case 'product_id':

case 'manufacturer_id':

case 'category_id':

case 'information_id':

$queries[] = $key . '=' . $value;

unset($data[$key]);

$postfix = 1;

break;

case 'path':

$categories = explode('_', $value);

foreach ($categories as $category) {

$queries[] = 'category_id=' . $category;

}

unset($data[$key]);

break;

default:

break;

}

}

if(empty($queries)) {

$queries[] = $route;

}

$rows = array();

foreach($queries as $query) {

if(isset($this->cache_data['queries'][$query])) {

$rows[] = array('query' => $query, 'keyword' => $this->cache_data['queries'][$query]);

}

}

if(count($rows) == count($queries)) {

$aliases = array();

foreach($rows as $row) {

$aliases[$row['query']] = $row['keyword'];

}

foreach($queries as $query) {

$seo_url .= '/' . rawurlencode($aliases[$query]);

}

}

if ($seo_url == '') return $link;

if($code != $this->config_language) {

$seo_url = $code . '/' . trim($seo_url, '/');

} else {

$seo_url = trim($seo_url, '/');

}

if ($component['scheme'] == 'https') {

$seo_url = $this->config->get('config_ssl') . $seo_url;

} else {

$seo_url = $this->config->get('config_url') . $seo_url;

}

if (isset($postfix)) {

$seo_url .= trim($this->config->get('config_seo_url_postfix'));

} else {

$seo_url .= '/';

}

if(substr($seo_url, -2) == '//') {

$seo_url = substr($seo_url, 0, -1);

}

if (count($data)) {

$seo_url .= '?' . urldecode(http_build_query($data, '', '&'));

}

return $seo_url;

}

private function getPathByProduct($product_id) {

$product_id = (int)$product_id;

if ($product_id < 1) return false;

static $path = null;

if (!is_array($path)) {

$path = $this->cache->get('product.seopath');

if (!is_array($path)) $path = array();

}

if (!isset($path[$product_id])) {

$query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . $product_id . "' ORDER BY main_category DESC LIMIT 1");

$path[$product_id] = $this->getPathByCategory($query->num_rows ? (int)$query->row['category_id'] : 0);

$this->cache->set('product.seopath', $path);

}

return $path[$product_id];

}

private function getPathByCategory($category_id) {

$category_id = (int)$category_id;

if ($category_id < 1) return false;

static $path = null;

if (!is_array($path)) {

$path = $this->cache->get('category.seopath');

if (!is_array($path)) $path = array();

}

if (!isset($path[$category_id])) {

$max_level = 10;

$sql = "SELECT CONCAT_WS('_'";

for ($i = $max_level-1; $i >= 0; --$i) {

$sql .= ",t$i.category_id";

}

$sql .= ") AS path FROM " . DB_PREFIX . "category t0";

for ($i = 1; $i < $max_level; ++$i) {

$sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)";

}

$sql .= " WHERE t0.category_id = '" . $category_id . "'";

$query = $this->db->query($sql);

$path[$category_id] = $query->num_rows ? $query->row['path'] : false;

$this->cache->set('category.seopath', $path);

}

return $path[$category_id];

}

private function validate() {

if (isset($this->request->get['route']) && $this->request->get['route'] == 'error/not_found') {

return;

}

if(empty($this->request->get['route'])) {

$this->request->get['route'] = 'common/home';

}

if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {

return;

}

if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {

$url = str_replace('&', '&', $this->config->get('config_ssl') . ltrim($this->request->server['REQUEST_URI'], '/'));

$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'SSL'));

} else {

$url = str_replace('&', '&', $this->config->get('config_url') . ltrim($this->request->server['REQUEST_URI'], '/'));

$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'NONSSL'));

}

if (rawurldecode($url) != rawurldecode($seo)) {

header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');

$this->response->redirect($seo);

}

}

private function getQueryString($exclude = array()) {

if (!is_array($exclude)) {

$exclude = array();

}

return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude))));

}

}

?>

 

Может кто подсказать как дальше пилить? Или какое то другое решение сложившейся проблемы.

 

OC 1.5.6.4

Разобрался с этим - рилииет все правильно.

Вот код, кому-то может пригодиться 

class ControllerCommonSeoPro extends Controller {

private $cache_data = null;

public function __construct($registry) {

parent::__construct($registry);

$this->cache_data = $this->cache->get('seo_pro');

if (!$this->cache_data) {

$query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias");

$this->cache_data = array();

foreach ($query->rows as $row) {

$this->cache_data['keywords'][$row['keyword']] = $row['query'];

$this->cache_data['queries'][$row['query']] = $row['keyword'];

}

$this->cache->set('seo_pro', $this->cache_data);

}

}

public function index() {

// Add rewrite to url class

if ($this->config->get('config_seo_url')) {

$this->url->addRewrite($this);

} else {

return;

}

// Decode URL

if (isset($this->request->get['_route_'])) {

$parts = explode('/', $this->request->get['_route_']);

foreach ($parts as $part) {

if( $this->config->get('config_seo_url_replace') ) {

$part = str_replace('_', ' ', $part);

}

if (isset($url[2])) {

$query = $this->db->query("SELECT a.* FROM " . DB_PREFIX . "url_alias a, " . DB_PREFIX . "category c WHERE a.keyword = '" . $this->db->escape($part) . "' AND a.query=CONCAT('category_id=', c.category_id) AND c.parent_id='$url[1]'");

} else {

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");

}

if ($query->num_rows) {

$url = explode('=', $query->row['query']);

if ($url[0] == 'product_id') {

$this->request->get['product_id'] = $url[1];

}

if ($url[0] == 'category_id') {

if (!isset($this->request->get['path'])) {

$this->request->get['path'] = $url[1];

} else {

$this->request->get['path'] .= '_' . $url[1];

}

}

if ($url[0] == 'manufacturer_id') {

$this->request->get['manufacturer_id'] = $url[1];

}

if ($url[0] == 'information_id') {

$this->request->get['information_id'] = $url[1];

}

} else {

$this->request->get['route'] = 'error/not_found';

}

}

if (isset($this->request->get['product_id'])) {

$this->request->get['route'] = 'product/product';

} elseif (isset($this->request->get['path'])) {

$this->request->get['route'] = 'product/category';

} elseif (isset($this->request->get['manufacturer_id'])) {

$this->request->get['route'] = 'product/manufacturer/product';

} elseif (isset($this->request->get['information_id'])) {

$this->request->get['route'] = 'information/information';

}

if (isset($this->request->get['route'])) {

return $this->forward($this->request->get['route']);

}

}

}

public function rewrite($link) {

if (!$this->config->get('config_seo_url')) return $link;

$seo_url = '';

$component = parse_url(str_replace('&', '&', $link));

$data = array();

parse_str($component['query'], $data);

$route = $data['route'];

unset($data['route']);

switch ($route) {

case 'product/product':

if (isset($data['product_id'])) {

$tmp = $data;

$data = array();

if ($this->config->get('config_seo_url_include_path')) {

$data['path'] = $this->getPathByProduct($tmp['product_id']);

if (!$data['path']) return $link;

}

$data['product_id'] = $tmp['product_id'];

if (isset($tmp['tracking'])) {

$data['tracking'] = $tmp['tracking'];

}

}

break;

case 'product/category':

if (isset($data['path'])) {

$category = explode('_', $data['path']);

$category = end($category);

$data['path'] = $this->getPathByCategory($category);

if (!$data['path']) return $link;

}

break;

case 'product/product/review':

case 'information/information/info':

return $link;

break;

default:

break;

}

if ($component['scheme'] == 'https') {

$link = $this->config->get('config_ssl');

} else {

$link = $this->config->get('config_url');

}

$link .= 'index.php?route=' . $route;

if (count($data)) {

$link .= '&' . urldecode(http_build_query($data, '', '&'));

}

$queries = array();

foreach ($data as $key => $value) {

switch ($key) {

case 'product_id':

case 'manufacturer_id':

case 'category_id':

case 'information_id':

case 'infocategory_id':

$queries[] = $key . '=' . $value;

unset($data[$key]);

$postfix = 1;

break;

case 'path':

$categories = explode('_', $value);

foreach ($categories as $category) {

$queries[] = 'category_id=' . $category;

}

unset($data[$key]);

break;

default:

break;

}

}

if(empty($queries)) {

$queries[] = $route;

}

$rows = array();

foreach($queries as $query) {

if(isset($this->cache_data['queries'][$query])) {

$rows[] = array('query' => $query, 'keyword' => $this->cache_data['queries'][$query]);

}

}

if(count($rows) == count($queries)) {

$aliases = array();

foreach($rows as $row) {

$aliases[$row['query']] = $row['keyword'];

}

foreach($queries as $query) {

$seo_url .= '/' . rawurlencode($aliases[$query]);

}

}

if ($seo_url == '') return $link;

$seo_url = trim($seo_url, '/');

if ($component['scheme'] == 'https') {

$seo_url = $this->config->get('config_ssl') . $seo_url;

} else {

$seo_url = $this->config->get('config_url') . $seo_url;

}

if (isset($postfix)) {

$seo_url .= trim($this->config->get('config_seo_url_postfix'));

} else {

$seo_url .= '/';

}

$seo_url = trim($seo_url, '//');

if (count($data)) {

$seo_url .= '?' . urldecode(http_build_query($data, '', '&'));

}

return $seo_url;

}

private function getPathByProduct($product_id) {

$product_id = (int)$product_id;

if ($product_id < 1) return false;

static $path = null;

if (!is_array($path)) {

$path = $this->cache->get('product.seopath');

if (!is_array($path)) $path = array();

}

if (!isset($path[$product_id])) {

$query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . $product_id . "' ORDER BY main_category DESC LIMIT 1");

$path[$product_id] = $this->getPathByCategory($query->num_rows ? (int)$query->row['category_id'] : 0);

$this->cache->set('product.seopath', $path);

}

return $path[$product_id];

}

private function getPathByCategory($category_id) {

$category_id = (int)$category_id;

if ($category_id < 1) return false;

static $path = null;

if (!is_array($path)) {

$path = $this->cache->get('category.seopath');

if (!is_array($path)) $path = array();

}

if (!isset($path[$category_id])) {

$max_level = 4;

$sql = "SELECT CONCAT_WS('_'";

for ($i = $max_level-1; $i >= 0; --$i) {

$sql .= ",t$i.category_id";

}

$sql .= ") AS path FROM " . DB_PREFIX . "category t0";

for ($i = 1; $i < $max_level; ++$i) {

$sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)";

}

$sql .= " WHERE t0.category_id = '" . $category_id . "'";

$query = $this->db->query($sql);

$path[$category_id] = $query->num_rows ? $query->row['path'] : false;

$this->cache->set('category.seopath', $path);

}

return $path[$category_id];

}

private function validate() {

if (empty($this->request->get['route']) || $this->request->get['route'] == 'error/not_found') {

return;

}

if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {

return;

}

if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {

$url = str_replace('&', '&', $this->config->get('config_ssl') . ltrim($this->request->server['REQUEST_URI'], '/'));

$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'SSL'));

} else {

$url = str_replace('&', '&', $this->config->get('config_url') . ltrim($this->request->server['REQUEST_URI'], '/'));

$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'NONSSL'));

}

if (rawurldecode($url) != rawurldecode($seo)) {

header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');

$this->response->redirect($seo);

}

}

private function getQueryString($exclude = array()) {

if (!is_array($exclude)) {

$exclude = array();

}

return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude))));

}

}

?>

Вопрос только один - как слеш добавить в конец урл - через .htaccess не подходит - сверху сидит злой СЕОшник)

Link to comment
Share on other sites


Не рилиило ЧПУ, на локальном компе. Проблема крылась в htaccess. Спасипотому что всем кто отписался в теме.

Edited by nextvid
Link to comment
Share on other sites


  • 2 weeks later...

Здравствуйте, усиновил листый осСтор, вклюлил сео про и алиасы товара которые были "ЧПУ-шные", превратились в index.php?route=product/product&product_id=52 , когда включаю синдарный чпу, алиасы приходят в норму. И все бы хорошо, только при синдартном ЧПУ появляются дубли страниц. В чем гдело? Как настроить чпу алиасов товаров с включенным сео про?

Edited by Jays0n
Link to comment
Share on other sites


Чисти кэш в system - storeage - cache (удаляй все, кроме index!!!) и резульит через секунды.

А ик все им рилииет. 

Вот тебе пример на ocStore 2.1.0.2.1

https://###.ru/control-modules/lighting-control/

                домен              категория        под категория

 

А когда на карточку товара выходишь, то покажет 

https://###.ru/control-modules/zipato-rgbw-lamp.php

               домен               категория           товар

 

И на будуещёе, пока налинаешь гделать, url гделай транскрипцией ###.ru/moduli-upravleniya/upravlenie-svetom/

Для Янгдекса это гуд, в выдаче url тоже подселивает. Для Гугла по барабану. Гугл в выдаче с англ на русский переводит url автоматом, только почему то не везгде.

Но я сивку на яшу потому чтольше гделаю.

Edited by SuperCoach
Link to comment
Share on other sites


Добрый гдень!

Я знаю, что вопрос поднимался не единожды, но найти решения за 3 часа поиска я не смог. Поэтому взываю к вашей помощи.

 

Как прописать страница пагинации "index, nofollow" ? Может кто-мини инструкцию расписать?

Link to comment
Share on other sites


  • 2 weeks later...
  • 2 weeks later...

Народ а SEO pro для opencart 2.3.0.2 суещёствует??? Просто есть вот икая проблемка с дублями

http://climat-store.com.ua/conditioner/kondicionery-nastennie/ftxs35k-rxs35k

http://climat-store.com.ua/conditioner/kondicionery-nastennie/ftxs35k-rxs35k?filter=131

Как бы два одинаковых товара но выводятся разными страницами, я понимаю что это синдартный фильтр, есть в планах покупка нормального фильтра, но хотелось бы проблему решить уже.

Link to comment
Share on other sites


Народ а SEO pro для opencart 2.3.0.2 суещёствует??? Просто есть вот икая проблемка с дублями

http://climat-store.com.ua/conditioner/kondicionery-nastennie/ftxs35k-rxs35k

http://climat-store.com.ua/conditioner/kondicionery-nastennie/ftxs35k-rxs35k?filter=131

Как бы два одинаковых товара но выводятся разными страницами, я понимаю что это синдартный фильтр, есть в планах покупка нормального фильтра, но хотелось бы проблему решить уже.

У Вас вторая ссылка закрыи от ингдексации через robots.txt, проблем с ней не должно быть.

Link to comment
Share on other sites


Link to comment
Share on other sites


Народ, осиётся открытым вопрос про дубли страниц на голом OpenCart 2.3.0.2.

Есть ли какое-то решение?

 

Уйти на OcStore 2.3 не бугдет возможности из-за подгдержки нужных модулей.

Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.