imushroom Опубліковано: 14 липня 2016 Share Опубліковано: 14 липня 2016 (змінено) Установлен 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 ОК Т.е. бесконечное множество дублей... как то можно от них избавиться? Змінено 14 липня 2016 користувачем imushroom Надіслати Поділитися на інших сайтах More sharing options...
chukcha Опубліковано: 15 липня 2016 Share Опубліковано: 15 липня 2016 Вы их сами генерите? https://www.google.ru/?123&gws_rd=ssl Надіслати Поділитися на інших сайтах More sharing options... imushroom Опубліковано: 15 липня 2016 Share Опубліковано: 15 липня 2016 Вы их сами генерите? https://www.google.ru/?123&gws_rd=ssl Нет. Но я хочу убрать саму возможность, т.к. по сути все эти страницы являются дублями главной. Надіслати Поділитися на інших сайтах More sharing options... Otvet Опубліковано: 16 липня 2016 Share Опубліковано: 16 липня 2016 А щит от лазера из космоса купили? ведь по сути это является угрозой Надіслати Поділитися на інших сайтах More sharing options... Dimasscus Опубліковано: 21 липня 2016 Share Опубліковано: 21 липня 2016 Привет всем. под ветку 2.2.0.0 есть решение? Надіслати Поділитися на інших сайтах More sharing options... PeterStudio Опубліковано: 23 липня 2016 Share Опубліковано: 23 липня 2016 Приветствую всех! И у меня тоже возникла проблема с дублями, OP 2.2, seo_pro Дубли получается вот такие /category1/sub-category1/tovar1 /category1/tovar1 Почему seo_pro такое не обрабатывает правильно? И как лучше всего исправить? Надіслати Поділитися на інших сайтах More sharing options... propmr Опубліковано: 29 липня 2016 Share Опубліковано: 29 липня 2016 Ребят помогите пожалуйста уже и не знаю что делать!такая беда с очень многими товарамивроде как сео все правильно делаетраньше такого небылос недавних пор таким образом пропадают товарыхотя в списке они есть но как заходишь в саму карточку то вот такая лабуда Надіслати Поділитися на інших сайтах More sharing options... 4 weeks later... LeonidxLee Опубліковано: 24 серпня 2016 Share Опубліковано: 24 серпня 2016 Здравствуйте! Приобретал Ваш модуль для сайта, модуль работает, всё отлично. Начали строить второй сайт хотим установить SeoPro. Вопрос на второй сайт модуль необходимо покупать повторно? Просто из описания модуля это не очевидно... https://opencartforum.com/files/file/1155-модуль-управления-seopro/ В личку написать не получается, пишет что у вас нет возможности принимать новые сообщения... ПС. Valogroup, мы с вами соседи по корпусу в Румянцево :) Надіслати Поділитися на інших сайтах More sharing options... vlad073 Опубліковано: 1 вересня 2016 Share Опубліковано: 1 вересня 2016 Доброе время суток. Кто нибудь решил вопрос с одинаковыми подкатегориями? То есть структура такая: -Бумага --Бумага А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 classif ($this->config->get('config_seo_url')) {$this->url->addRewrite($this);} else {return;}// Decode URLif (!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 Надіслати Поділитися на інших сайтах More sharing options... vlad073 Опубліковано: 1 вересня 2016 Share Опубліковано: 1 вересня 2016 Доброе время суток. Кто нибудь решил вопрос с одинаковыми подкатегориями? То есть структура такая: -Бумага --Бумага А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 не подходит - сверху сидит злой СЕОшник) Надіслати Поділитися на інших сайтах More sharing options... nextvid Опубліковано: 9 вересня 2016 Share Опубліковано: 9 вересня 2016 (змінено) Не работало ЧПУ, на локальном компе. Проблема крылась в htaccess. Спасибо всем кто отписался в теме. Змінено 9 вересня 2016 користувачем nextvid Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... Jays0n Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 (змінено) Здравствуйте, установил чистый осСтор, включил сео про и алиасы товара которые были "ЧПУ-шные", превратились в index.php?route=product/product&product_id=52 , когда включаю стандарный чпу, алиасы приходят в норму. И все бы хорошо, только при стандартном ЧПУ появляются дубли страниц. В чем дело? Как настроить чпу алиасов товаров с включенным сео про? Змінено 18 вересня 2016 користувачем Jays0n Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 видимо нет у категорий ЧПУ Надіслати Поділитися на інших сайтах More sharing options... Otvet Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 или ждать час Надіслати Поділитися на інших сайтах More sharing options... SuperCoach Опубліковано: 23 вересня 2016 Share Опубліковано: 23 вересня 2016 (змінено) Чисти кэш в 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 автоматом, только почему то не везде. Но я ставку на яшу больше делаю. Змінено 23 вересня 2016 користувачем SuperCoach Надіслати Поділитися на інших сайтах More sharing options... whoisthere Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 Добрый день! Я знаю, что вопрос поднимался не единожды, но найти решения за 3 часа поиска я не смог. Поэтому взываю к вашей помощи. Как прописать страница пагинации "index, nofollow" ? Может кто-мини инструкцию расписать? Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 3 часа? мАмА дАрАгАя https://opencartforum.com/files/file/2839-robots-noindex/ Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... cyberkekc Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Надіслати Поділитися на інших сайтах More sharing options... zomo Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Это и есть под 2 Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... Nikitasprava Опубліковано: 22 жовтня 2016 Share Опубліковано: 22 жовтня 2016 Народ а 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 Как бы два одинаковых товара но выводятся разными страницами, я понимаю что это стандартный фильтр, есть в планах покупка нормального фильтра, но хотелось бы проблему решить уже. Надіслати Поділитися на інших сайтах More sharing options... Donaldduck777 Опубліковано: 24 жовтня 2016 Share Опубліковано: 24 жовтня 2016 Народ а 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, проблем с ней не должно быть. Надіслати Поділитися на інших сайтах More sharing options... rezhisser Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ Надіслати Поділитися на інших сайтах More sharing options... Yoda Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ А вы просто почистите кеш. Должно сработать! Надіслати Поділитися на інших сайтах More sharing options... GRX Опубліковано: 31 жовтня 2016 Share Опубліковано: 31 жовтня 2016 Народ, остаётся открытым вопрос про дубли страниц на голом OpenCart 2.3.0.2. Есть ли какое-то решение? Уйти на OcStore 2.3 не будет возможности из-за поддержки нужных модулей. Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 1 листопада 2016 Share Опубліковано: 1 листопада 2016 интеграция seo_pro Надіслати Поділитися на інших сайтах More sharing options... Назад 58 59 60 61 62 63 64 65 66 67 68 Вперед Сторінка 63 з 72 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 4 Перейти до списку тем Схожі публікації [Поддержка] SEO Генератор мета тегов (категории, товары, производители, статьи), SEO URL - Мультиязык 1 2 3 4 10 Автор: legioner26, 31 березня 2019 метатеги seo-h1 (і ще %d) Теги: метатеги seo-h1 title meta descritption keywords seo чпу url seopro автозаполнение seo автозаполнение seo url автоматическая генерация мета-тегов seo генератор url seo генератор чпу дубли урл дубли удаление дублей дубли категорий дубли товаров дубли статей дубли страниц индексация дубли страниц сео продвижение мета теги title настройка сео продвижение сайта топ 10 выдача сайта автоматическая генерация title и description автоматическая генерация мета-тегов title и description автозаполнение мета тегов сеоген seogen автогенерация seo генераций url мета теги мета теги заполнение выдача в поиске продвижение opencart опенкарт сео опенкарт мета теги opencart seo мультиязык чпу мультиязык мультиязык сео чпу для статей генерация сео статьи производители url производиетли url url_alias url страниц чпу seo 232 відповіді 20 702 перегляди legioner26 6 січня 2022 Избавиться от дублей товаров Автор: kostya242, 15 вересня 2021 дубли 9 відповідей 622 перегляди chukcha 15 вересня 2021 Какое оптимальное решение проблемы дублей в OP 3 для наступающего 2021 Автор: smart_center, 31 грудня 2020 opencart 3 дубли (і ще %d) Теги: opencart 3 дубли дубли страниц seopro seo pro canonical 13 відповідей 1 315 переглядів pawana 1 січня 2021 Хлебные крошки или дубли Автор: Poxod86, 20 березня 2020 дубли хлебные крошки (і ще %d) Теги: дубли хлебные крошки ошибки 3 відповіді 805 переглядів Otvet 20 березня 2020 Товары копируются 2 раза Автор: ScartFM, 2 жовтня 2019 копирование товары (і ще %d) Теги: копирование товары дубли 4 відповіді 1 464 перегляди stickpro 2 жовтня 2019 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Реклама і просування SEO-питання (оптимізація та просування магазину) дубли страниц, seoPro Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
imushroom Опубліковано: 15 липня 2016 Share Опубліковано: 15 липня 2016 Вы их сами генерите? https://www.google.ru/?123&gws_rd=ssl Нет. Но я хочу убрать саму возможность, т.к. по сути все эти страницы являются дублями главной. Надіслати Поділитися на інших сайтах More sharing options...
Otvet Опубліковано: 16 липня 2016 Share Опубліковано: 16 липня 2016 А щит от лазера из космоса купили? ведь по сути это является угрозой Надіслати Поділитися на інших сайтах More sharing options... Dimasscus Опубліковано: 21 липня 2016 Share Опубліковано: 21 липня 2016 Привет всем. под ветку 2.2.0.0 есть решение? Надіслати Поділитися на інших сайтах More sharing options... PeterStudio Опубліковано: 23 липня 2016 Share Опубліковано: 23 липня 2016 Приветствую всех! И у меня тоже возникла проблема с дублями, OP 2.2, seo_pro Дубли получается вот такие /category1/sub-category1/tovar1 /category1/tovar1 Почему seo_pro такое не обрабатывает правильно? И как лучше всего исправить? Надіслати Поділитися на інших сайтах More sharing options... propmr Опубліковано: 29 липня 2016 Share Опубліковано: 29 липня 2016 Ребят помогите пожалуйста уже и не знаю что делать!такая беда с очень многими товарамивроде как сео все правильно делаетраньше такого небылос недавних пор таким образом пропадают товарыхотя в списке они есть но как заходишь в саму карточку то вот такая лабуда Надіслати Поділитися на інших сайтах More sharing options... 4 weeks later... LeonidxLee Опубліковано: 24 серпня 2016 Share Опубліковано: 24 серпня 2016 Здравствуйте! Приобретал Ваш модуль для сайта, модуль работает, всё отлично. Начали строить второй сайт хотим установить SeoPro. Вопрос на второй сайт модуль необходимо покупать повторно? Просто из описания модуля это не очевидно... https://opencartforum.com/files/file/1155-модуль-управления-seopro/ В личку написать не получается, пишет что у вас нет возможности принимать новые сообщения... ПС. Valogroup, мы с вами соседи по корпусу в Румянцево :) Надіслати Поділитися на інших сайтах More sharing options... vlad073 Опубліковано: 1 вересня 2016 Share Опубліковано: 1 вересня 2016 Доброе время суток. Кто нибудь решил вопрос с одинаковыми подкатегориями? То есть структура такая: -Бумага --Бумага А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 classif ($this->config->get('config_seo_url')) {$this->url->addRewrite($this);} else {return;}// Decode URLif (!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 Надіслати Поділитися на інших сайтах More sharing options... vlad073 Опубліковано: 1 вересня 2016 Share Опубліковано: 1 вересня 2016 Доброе время суток. Кто нибудь решил вопрос с одинаковыми подкатегориями? То есть структура такая: -Бумага --Бумага А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 не подходит - сверху сидит злой СЕОшник) Надіслати Поділитися на інших сайтах More sharing options... nextvid Опубліковано: 9 вересня 2016 Share Опубліковано: 9 вересня 2016 (змінено) Не работало ЧПУ, на локальном компе. Проблема крылась в htaccess. Спасибо всем кто отписался в теме. Змінено 9 вересня 2016 користувачем nextvid Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... Jays0n Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 (змінено) Здравствуйте, установил чистый осСтор, включил сео про и алиасы товара которые были "ЧПУ-шные", превратились в index.php?route=product/product&product_id=52 , когда включаю стандарный чпу, алиасы приходят в норму. И все бы хорошо, только при стандартном ЧПУ появляются дубли страниц. В чем дело? Как настроить чпу алиасов товаров с включенным сео про? Змінено 18 вересня 2016 користувачем Jays0n Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 видимо нет у категорий ЧПУ Надіслати Поділитися на інших сайтах More sharing options... Otvet Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 или ждать час Надіслати Поділитися на інших сайтах More sharing options... SuperCoach Опубліковано: 23 вересня 2016 Share Опубліковано: 23 вересня 2016 (змінено) Чисти кэш в 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 автоматом, только почему то не везде. Но я ставку на яшу больше делаю. Змінено 23 вересня 2016 користувачем SuperCoach Надіслати Поділитися на інших сайтах More sharing options... whoisthere Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 Добрый день! Я знаю, что вопрос поднимался не единожды, но найти решения за 3 часа поиска я не смог. Поэтому взываю к вашей помощи. Как прописать страница пагинации "index, nofollow" ? Может кто-мини инструкцию расписать? Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 3 часа? мАмА дАрАгАя https://opencartforum.com/files/file/2839-robots-noindex/ Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... cyberkekc Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Надіслати Поділитися на інших сайтах More sharing options... zomo Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Это и есть под 2 Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... Nikitasprava Опубліковано: 22 жовтня 2016 Share Опубліковано: 22 жовтня 2016 Народ а 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 Как бы два одинаковых товара но выводятся разными страницами, я понимаю что это стандартный фильтр, есть в планах покупка нормального фильтра, но хотелось бы проблему решить уже. Надіслати Поділитися на інших сайтах More sharing options... Donaldduck777 Опубліковано: 24 жовтня 2016 Share Опубліковано: 24 жовтня 2016 Народ а 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, проблем с ней не должно быть. Надіслати Поділитися на інших сайтах More sharing options... rezhisser Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ Надіслати Поділитися на інших сайтах More sharing options... Yoda Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ А вы просто почистите кеш. Должно сработать! Надіслати Поділитися на інших сайтах More sharing options... GRX Опубліковано: 31 жовтня 2016 Share Опубліковано: 31 жовтня 2016 Народ, остаётся открытым вопрос про дубли страниц на голом OpenCart 2.3.0.2. Есть ли какое-то решение? Уйти на OcStore 2.3 не будет возможности из-за поддержки нужных модулей. Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 1 листопада 2016 Share Опубліковано: 1 листопада 2016 интеграция seo_pro Надіслати Поділитися на інших сайтах More sharing options... Назад 58 59 60 61 62 63 64 65 66 67 68 Вперед Сторінка 63 з 72 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 4 Перейти до списку тем Схожі публікації [Поддержка] SEO Генератор мета тегов (категории, товары, производители, статьи), SEO URL - Мультиязык 1 2 3 4 10 Автор: legioner26, 31 березня 2019 метатеги seo-h1 (і ще %d) Теги: метатеги seo-h1 title meta descritption keywords seo чпу url seopro автозаполнение seo автозаполнение seo url автоматическая генерация мета-тегов seo генератор url seo генератор чпу дубли урл дубли удаление дублей дубли категорий дубли товаров дубли статей дубли страниц индексация дубли страниц сео продвижение мета теги title настройка сео продвижение сайта топ 10 выдача сайта автоматическая генерация title и description автоматическая генерация мета-тегов title и description автозаполнение мета тегов сеоген seogen автогенерация seo генераций url мета теги мета теги заполнение выдача в поиске продвижение opencart опенкарт сео опенкарт мета теги opencart seo мультиязык чпу мультиязык мультиязык сео чпу для статей генерация сео статьи производители url производиетли url url_alias url страниц чпу seo 232 відповіді 20 702 перегляди legioner26 6 січня 2022 Избавиться от дублей товаров Автор: kostya242, 15 вересня 2021 дубли 9 відповідей 622 перегляди chukcha 15 вересня 2021 Какое оптимальное решение проблемы дублей в OP 3 для наступающего 2021 Автор: smart_center, 31 грудня 2020 opencart 3 дубли (і ще %d) Теги: opencart 3 дубли дубли страниц seopro seo pro canonical 13 відповідей 1 315 переглядів pawana 1 січня 2021 Хлебные крошки или дубли Автор: Poxod86, 20 березня 2020 дубли хлебные крошки (і ще %d) Теги: дубли хлебные крошки ошибки 3 відповіді 805 переглядів Otvet 20 березня 2020 Товары копируются 2 раза Автор: ScartFM, 2 жовтня 2019 копирование товары (і ще %d) Теги: копирование товары дубли 4 відповіді 1 464 перегляди stickpro 2 жовтня 2019 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Реклама і просування SEO-питання (оптимізація та просування магазину) дубли страниц, seoPro Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
Dimasscus Опубліковано: 21 липня 2016 Share Опубліковано: 21 липня 2016 Привет всем. под ветку 2.2.0.0 есть решение? Надіслати Поділитися на інших сайтах More sharing options...
PeterStudio Опубліковано: 23 липня 2016 Share Опубліковано: 23 липня 2016 Приветствую всех! И у меня тоже возникла проблема с дублями, OP 2.2, seo_pro Дубли получается вот такие /category1/sub-category1/tovar1 /category1/tovar1 Почему seo_pro такое не обрабатывает правильно? И как лучше всего исправить? Надіслати Поділитися на інших сайтах More sharing options...
propmr Опубліковано: 29 липня 2016 Share Опубліковано: 29 липня 2016 Ребят помогите пожалуйста уже и не знаю что делать!такая беда с очень многими товарамивроде как сео все правильно делаетраньше такого небылос недавних пор таким образом пропадают товарыхотя в списке они есть но как заходишь в саму карточку то вот такая лабуда Надіслати Поділитися на інших сайтах More sharing options...
LeonidxLee Опубліковано: 24 серпня 2016 Share Опубліковано: 24 серпня 2016 Здравствуйте! Приобретал Ваш модуль для сайта, модуль работает, всё отлично. Начали строить второй сайт хотим установить SeoPro. Вопрос на второй сайт модуль необходимо покупать повторно? Просто из описания модуля это не очевидно... https://opencartforum.com/files/file/1155-модуль-управления-seopro/ В личку написать не получается, пишет что у вас нет возможности принимать новые сообщения... ПС. Valogroup, мы с вами соседи по корпусу в Румянцево :) Надіслати Поділитися на інших сайтах More sharing options...
vlad073 Опубліковано: 1 вересня 2016 Share Опубліковано: 1 вересня 2016 Доброе время суток. Кто нибудь решил вопрос с одинаковыми подкатегориями? То есть структура такая: -Бумага --Бумага А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 classif ($this->config->get('config_seo_url')) {$this->url->addRewrite($this);} else {return;}// Decode URLif (!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 Надіслати Поділитися на інших сайтах More sharing options...
vlad073 Опубліковано: 1 вересня 2016 Share Опубліковано: 1 вересня 2016 Доброе время суток. Кто нибудь решил вопрос с одинаковыми подкатегориями? То есть структура такая: -Бумага --Бумага А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 не подходит - сверху сидит злой СЕОшник) Надіслати Поділитися на інших сайтах More sharing options...
nextvid Опубліковано: 9 вересня 2016 Share Опубліковано: 9 вересня 2016 (змінено) Не работало ЧПУ, на локальном компе. Проблема крылась в htaccess. Спасибо всем кто отписался в теме. Змінено 9 вересня 2016 користувачем nextvid Надіслати Поділитися на інших сайтах More sharing options...
Jays0n Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 (змінено) Здравствуйте, установил чистый осСтор, включил сео про и алиасы товара которые были "ЧПУ-шные", превратились в index.php?route=product/product&product_id=52 , когда включаю стандарный чпу, алиасы приходят в норму. И все бы хорошо, только при стандартном ЧПУ появляются дубли страниц. В чем дело? Как настроить чпу алиасов товаров с включенным сео про? Змінено 18 вересня 2016 користувачем Jays0n Надіслати Поділитися на інших сайтах More sharing options...
chukcha Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 видимо нет у категорий ЧПУ Надіслати Поділитися на інших сайтах More sharing options... Otvet Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 или ждать час Надіслати Поділитися на інших сайтах More sharing options... SuperCoach Опубліковано: 23 вересня 2016 Share Опубліковано: 23 вересня 2016 (змінено) Чисти кэш в 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 автоматом, только почему то не везде. Но я ставку на яшу больше делаю. Змінено 23 вересня 2016 користувачем SuperCoach Надіслати Поділитися на інших сайтах More sharing options... whoisthere Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 Добрый день! Я знаю, что вопрос поднимался не единожды, но найти решения за 3 часа поиска я не смог. Поэтому взываю к вашей помощи. Как прописать страница пагинации "index, nofollow" ? Может кто-мини инструкцию расписать? Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 3 часа? мАмА дАрАгАя https://opencartforum.com/files/file/2839-robots-noindex/ Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... cyberkekc Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Надіслати Поділитися на інших сайтах More sharing options... zomo Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Это и есть под 2 Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... Nikitasprava Опубліковано: 22 жовтня 2016 Share Опубліковано: 22 жовтня 2016 Народ а 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 Как бы два одинаковых товара но выводятся разными страницами, я понимаю что это стандартный фильтр, есть в планах покупка нормального фильтра, но хотелось бы проблему решить уже. Надіслати Поділитися на інших сайтах More sharing options... Donaldduck777 Опубліковано: 24 жовтня 2016 Share Опубліковано: 24 жовтня 2016 Народ а 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, проблем с ней не должно быть. Надіслати Поділитися на інших сайтах More sharing options... rezhisser Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ Надіслати Поділитися на інших сайтах More sharing options... Yoda Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ А вы просто почистите кеш. Должно сработать! Надіслати Поділитися на інших сайтах More sharing options... GRX Опубліковано: 31 жовтня 2016 Share Опубліковано: 31 жовтня 2016 Народ, остаётся открытым вопрос про дубли страниц на голом OpenCart 2.3.0.2. Есть ли какое-то решение? Уйти на OcStore 2.3 не будет возможности из-за поддержки нужных модулей. Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 1 листопада 2016 Share Опубліковано: 1 листопада 2016 интеграция seo_pro Надіслати Поділитися на інших сайтах More sharing options... Назад 58 59 60 61 62 63 64 65 66 67 68 Вперед Сторінка 63 з 72 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 4 Перейти до списку тем Схожі публікації [Поддержка] SEO Генератор мета тегов (категории, товары, производители, статьи), SEO URL - Мультиязык 1 2 3 4 10 Автор: legioner26, 31 березня 2019 метатеги seo-h1 (і ще %d) Теги: метатеги seo-h1 title meta descritption keywords seo чпу url seopro автозаполнение seo автозаполнение seo url автоматическая генерация мета-тегов seo генератор url seo генератор чпу дубли урл дубли удаление дублей дубли категорий дубли товаров дубли статей дубли страниц индексация дубли страниц сео продвижение мета теги title настройка сео продвижение сайта топ 10 выдача сайта автоматическая генерация title и description автоматическая генерация мета-тегов title и description автозаполнение мета тегов сеоген seogen автогенерация seo генераций url мета теги мета теги заполнение выдача в поиске продвижение opencart опенкарт сео опенкарт мета теги opencart seo мультиязык чпу мультиязык мультиязык сео чпу для статей генерация сео статьи производители url производиетли url url_alias url страниц чпу seo 232 відповіді 20 702 перегляди legioner26 6 січня 2022 Избавиться от дублей товаров Автор: kostya242, 15 вересня 2021 дубли 9 відповідей 622 перегляди chukcha 15 вересня 2021 Какое оптимальное решение проблемы дублей в OP 3 для наступающего 2021 Автор: smart_center, 31 грудня 2020 opencart 3 дубли (і ще %d) Теги: opencart 3 дубли дубли страниц seopro seo pro canonical 13 відповідей 1 315 переглядів pawana 1 січня 2021 Хлебные крошки или дубли Автор: Poxod86, 20 березня 2020 дубли хлебные крошки (і ще %d) Теги: дубли хлебные крошки ошибки 3 відповіді 805 переглядів Otvet 20 березня 2020 Товары копируются 2 раза Автор: ScartFM, 2 жовтня 2019 копирование товары (і ще %d) Теги: копирование товары дубли 4 відповіді 1 464 перегляди stickpro 2 жовтня 2019 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Реклама і просування SEO-питання (оптимізація та просування магазину) дубли страниц, seoPro Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
Otvet Опубліковано: 18 вересня 2016 Share Опубліковано: 18 вересня 2016 или ждать час Надіслати Поділитися на інших сайтах More sharing options... SuperCoach Опубліковано: 23 вересня 2016 Share Опубліковано: 23 вересня 2016 (змінено) Чисти кэш в 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 автоматом, только почему то не везде. Но я ставку на яшу больше делаю. Змінено 23 вересня 2016 користувачем SuperCoach Надіслати Поділитися на інших сайтах More sharing options... whoisthere Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 Добрый день! Я знаю, что вопрос поднимался не единожды, но найти решения за 3 часа поиска я не смог. Поэтому взываю к вашей помощи. Как прописать страница пагинации "index, nofollow" ? Может кто-мини инструкцию расписать? Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 3 часа? мАмА дАрАгАя https://opencartforum.com/files/file/2839-robots-noindex/ Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... cyberkekc Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Надіслати Поділитися на інших сайтах More sharing options... zomo Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Это и есть под 2 Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... Nikitasprava Опубліковано: 22 жовтня 2016 Share Опубліковано: 22 жовтня 2016 Народ а 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 Как бы два одинаковых товара но выводятся разными страницами, я понимаю что это стандартный фильтр, есть в планах покупка нормального фильтра, но хотелось бы проблему решить уже. Надіслати Поділитися на інших сайтах More sharing options... Donaldduck777 Опубліковано: 24 жовтня 2016 Share Опубліковано: 24 жовтня 2016 Народ а 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, проблем с ней не должно быть. Надіслати Поділитися на інших сайтах More sharing options... rezhisser Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ Надіслати Поділитися на інших сайтах More sharing options... Yoda Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ А вы просто почистите кеш. Должно сработать! Надіслати Поділитися на інших сайтах More sharing options... GRX Опубліковано: 31 жовтня 2016 Share Опубліковано: 31 жовтня 2016 Народ, остаётся открытым вопрос про дубли страниц на голом OpenCart 2.3.0.2. Есть ли какое-то решение? Уйти на OcStore 2.3 не будет возможности из-за поддержки нужных модулей. Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 1 листопада 2016 Share Опубліковано: 1 листопада 2016 интеграция seo_pro Надіслати Поділитися на інших сайтах More sharing options... Назад 58 59 60 61 62 63 64 65 66 67 68 Вперед Сторінка 63 з 72 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 4 Перейти до списку тем Схожі публікації [Поддержка] SEO Генератор мета тегов (категории, товары, производители, статьи), SEO URL - Мультиязык 1 2 3 4 10 Автор: legioner26, 31 березня 2019 метатеги seo-h1 (і ще %d) Теги: метатеги seo-h1 title meta descritption keywords seo чпу url seopro автозаполнение seo автозаполнение seo url автоматическая генерация мета-тегов seo генератор url seo генератор чпу дубли урл дубли удаление дублей дубли категорий дубли товаров дубли статей дубли страниц индексация дубли страниц сео продвижение мета теги title настройка сео продвижение сайта топ 10 выдача сайта автоматическая генерация title и description автоматическая генерация мета-тегов title и description автозаполнение мета тегов сеоген seogen автогенерация seo генераций url мета теги мета теги заполнение выдача в поиске продвижение opencart опенкарт сео опенкарт мета теги opencart seo мультиязык чпу мультиязык мультиязык сео чпу для статей генерация сео статьи производители url производиетли url url_alias url страниц чпу seo 232 відповіді 20 702 перегляди legioner26 6 січня 2022 Избавиться от дублей товаров Автор: kostya242, 15 вересня 2021 дубли 9 відповідей 622 перегляди chukcha 15 вересня 2021 Какое оптимальное решение проблемы дублей в OP 3 для наступающего 2021 Автор: smart_center, 31 грудня 2020 opencart 3 дубли (і ще %d) Теги: opencart 3 дубли дубли страниц seopro seo pro canonical 13 відповідей 1 315 переглядів pawana 1 січня 2021 Хлебные крошки или дубли Автор: Poxod86, 20 березня 2020 дубли хлебные крошки (і ще %d) Теги: дубли хлебные крошки ошибки 3 відповіді 805 переглядів Otvet 20 березня 2020 Товары копируются 2 раза Автор: ScartFM, 2 жовтня 2019 копирование товары (і ще %d) Теги: копирование товары дубли 4 відповіді 1 464 перегляди stickpro 2 жовтня 2019 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Реклама і просування SEO-питання (оптимізація та просування магазину) дубли страниц, seoPro Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich
SuperCoach Опубліковано: 23 вересня 2016 Share Опубліковано: 23 вересня 2016 (змінено) Чисти кэш в 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 автоматом, только почему то не везде. Но я ставку на яшу больше делаю. Змінено 23 вересня 2016 користувачем SuperCoach Надіслати Поділитися на інших сайтах More sharing options...
whoisthere Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 Добрый день! Я знаю, что вопрос поднимался не единожды, но найти решения за 3 часа поиска я не смог. Поэтому взываю к вашей помощи. Как прописать страница пагинации "index, nofollow" ? Может кто-мини инструкцию расписать? Надіслати Поділитися на інших сайтах More sharing options...
chukcha Опубліковано: 29 вересня 2016 Share Опубліковано: 29 вересня 2016 3 часа? мАмА дАрАгАя https://opencartforum.com/files/file/2839-robots-noindex/ Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... cyberkekc Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Надіслати Поділитися на інших сайтах More sharing options... zomo Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Это и есть под 2 Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... Nikitasprava Опубліковано: 22 жовтня 2016 Share Опубліковано: 22 жовтня 2016 Народ а 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 Как бы два одинаковых товара но выводятся разными страницами, я понимаю что это стандартный фильтр, есть в планах покупка нормального фильтра, но хотелось бы проблему решить уже. Надіслати Поділитися на інших сайтах More sharing options... Donaldduck777 Опубліковано: 24 жовтня 2016 Share Опубліковано: 24 жовтня 2016 Народ а 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, проблем с ней не должно быть. Надіслати Поділитися на інших сайтах More sharing options... rezhisser Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ Надіслати Поділитися на інших сайтах More sharing options... Yoda Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ А вы просто почистите кеш. Должно сработать! Надіслати Поділитися на інших сайтах More sharing options... GRX Опубліковано: 31 жовтня 2016 Share Опубліковано: 31 жовтня 2016 Народ, остаётся открытым вопрос про дубли страниц на голом OpenCart 2.3.0.2. Есть ли какое-то решение? Уйти на OcStore 2.3 не будет возможности из-за поддержки нужных модулей. Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 1 листопада 2016 Share Опубліковано: 1 листопада 2016 интеграция seo_pro Надіслати Поділитися на інших сайтах More sharing options... Назад 58 59 60 61 62 63 64 65 66 67 68 Вперед Сторінка 63 з 72 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 4 Перейти до списку тем Схожі публікації [Поддержка] SEO Генератор мета тегов (категории, товары, производители, статьи), SEO URL - Мультиязык 1 2 3 4 10 Автор: legioner26, 31 березня 2019 метатеги seo-h1 (і ще %d) Теги: метатеги seo-h1 title meta descritption keywords seo чпу url seopro автозаполнение seo автозаполнение seo url автоматическая генерация мета-тегов seo генератор url seo генератор чпу дубли урл дубли удаление дублей дубли категорий дубли товаров дубли статей дубли страниц индексация дубли страниц сео продвижение мета теги title настройка сео продвижение сайта топ 10 выдача сайта автоматическая генерация title и description автоматическая генерация мета-тегов title и description автозаполнение мета тегов сеоген seogen автогенерация seo генераций url мета теги мета теги заполнение выдача в поиске продвижение opencart опенкарт сео опенкарт мета теги opencart seo мультиязык чпу мультиязык мультиязык сео чпу для статей генерация сео статьи производители url производиетли url url_alias url страниц чпу seo 232 відповіді 20 702 перегляди legioner26 6 січня 2022 Избавиться от дублей товаров Автор: kostya242, 15 вересня 2021 дубли 9 відповідей 622 перегляди chukcha 15 вересня 2021 Какое оптимальное решение проблемы дублей в OP 3 для наступающего 2021 Автор: smart_center, 31 грудня 2020 opencart 3 дубли (і ще %d) Теги: opencart 3 дубли дубли страниц seopro seo pro canonical 13 відповідей 1 315 переглядів pawana 1 січня 2021 Хлебные крошки или дубли Автор: Poxod86, 20 березня 2020 дубли хлебные крошки (і ще %d) Теги: дубли хлебные крошки ошибки 3 відповіді 805 переглядів Otvet 20 березня 2020 Товары копируются 2 раза Автор: ScartFM, 2 жовтня 2019 копирование товары (і ще %d) Теги: копирование товары дубли 4 відповіді 1 464 перегляди stickpro 2 жовтня 2019 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Реклама і просування SEO-питання (оптимізація та просування магазину) дубли страниц, seoPro
cyberkekc Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Надіслати Поділитися на інших сайтах More sharing options...
zomo Опубліковано: 9 жовтня 2016 Share Опубліковано: 9 жовтня 2016 Не могу найти такое же решение на OCstore 2 Это и есть под 2 Надіслати Поділитися на інших сайтах More sharing options... 2 weeks later... Nikitasprava Опубліковано: 22 жовтня 2016 Share Опубліковано: 22 жовтня 2016 Народ а 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 Как бы два одинаковых товара но выводятся разными страницами, я понимаю что это стандартный фильтр, есть в планах покупка нормального фильтра, но хотелось бы проблему решить уже. Надіслати Поділитися на інших сайтах More sharing options... Donaldduck777 Опубліковано: 24 жовтня 2016 Share Опубліковано: 24 жовтня 2016 Народ а 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, проблем с ней не должно быть. Надіслати Поділитися на інших сайтах More sharing options... rezhisser Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ Надіслати Поділитися на інших сайтах More sharing options... Yoda Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ А вы просто почистите кеш. Должно сработать! Надіслати Поділитися на інших сайтах More sharing options... GRX Опубліковано: 31 жовтня 2016 Share Опубліковано: 31 жовтня 2016 Народ, остаётся открытым вопрос про дубли страниц на голом OpenCart 2.3.0.2. Есть ли какое-то решение? Уйти на OcStore 2.3 не будет возможности из-за поддержки нужных модулей. Надіслати Поділитися на інших сайтах More sharing options... chukcha Опубліковано: 1 листопада 2016 Share Опубліковано: 1 листопада 2016 интеграция seo_pro Надіслати Поділитися на інших сайтах More sharing options... Назад 58 59 60 61 62 63 64 65 66 67 68 Вперед Сторінка 63 з 72 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 4 Перейти до списку тем Схожі публікації [Поддержка] SEO Генератор мета тегов (категории, товары, производители, статьи), SEO URL - Мультиязык 1 2 3 4 10 Автор: legioner26, 31 березня 2019 метатеги seo-h1 (і ще %d) Теги: метатеги seo-h1 title meta descritption keywords seo чпу url seopro автозаполнение seo автозаполнение seo url автоматическая генерация мета-тегов seo генератор url seo генератор чпу дубли урл дубли удаление дублей дубли категорий дубли товаров дубли статей дубли страниц индексация дубли страниц сео продвижение мета теги title настройка сео продвижение сайта топ 10 выдача сайта автоматическая генерация title и description автоматическая генерация мета-тегов title и description автозаполнение мета тегов сеоген seogen автогенерация seo генераций url мета теги мета теги заполнение выдача в поиске продвижение opencart опенкарт сео опенкарт мета теги opencart seo мультиязык чпу мультиязык мультиязык сео чпу для статей генерация сео статьи производители url производиетли url url_alias url страниц чпу seo 232 відповіді 20 702 перегляди legioner26 6 січня 2022 Избавиться от дублей товаров Автор: kostya242, 15 вересня 2021 дубли 9 відповідей 622 перегляди chukcha 15 вересня 2021 Какое оптимальное решение проблемы дублей в OP 3 для наступающего 2021 Автор: smart_center, 31 грудня 2020 opencart 3 дубли (і ще %d) Теги: opencart 3 дубли дубли страниц seopro seo pro canonical 13 відповідей 1 315 переглядів pawana 1 січня 2021 Хлебные крошки или дубли Автор: Poxod86, 20 березня 2020 дубли хлебные крошки (і ще %d) Теги: дубли хлебные крошки ошибки 3 відповіді 805 переглядів Otvet 20 березня 2020 Товары копируются 2 раза Автор: ScartFM, 2 жовтня 2019 копирование товары (і ще %d) Теги: копирование товары дубли 4 відповіді 1 464 перегляди stickpro 2 жовтня 2019 Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку
Nikitasprava Опубліковано: 22 жовтня 2016 Share Опубліковано: 22 жовтня 2016 Народ а 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 Как бы два одинаковых товара но выводятся разными страницами, я понимаю что это стандартный фильтр, есть в планах покупка нормального фильтра, но хотелось бы проблему решить уже. Надіслати Поділитися на інших сайтах More sharing options...
Donaldduck777 Опубліковано: 24 жовтня 2016 Share Опубліковано: 24 жовтня 2016 Народ а 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, проблем с ней не должно быть. Надіслати Поділитися на інших сайтах More sharing options...
rezhisser Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ Надіслати Поділитися на інших сайтах More sharing options...
Yoda Опубліковано: 27 жовтня 2016 Share Опубліковано: 27 жовтня 2016 Доброй ночи! Может кто подскажет ответ? - https://opencartforum.com/topic/66983-seopro-%D1%80%D0%B5%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82-%D0%B8-%D0%BC%D0%B0%D1%81%D1%81-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-%D0%B2-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D1%85/ А вы просто почистите кеш. Должно сработать! Надіслати Поділитися на інших сайтах More sharing options...
GRX Опубліковано: 31 жовтня 2016 Share Опубліковано: 31 жовтня 2016 Народ, остаётся открытым вопрос про дубли страниц на голом OpenCart 2.3.0.2. Есть ли какое-то решение? Уйти на OcStore 2.3 не будет возможности из-за поддержки нужных модулей. Надіслати Поділитися на інших сайтах More sharing options...
chukcha Опубліковано: 1 листопада 2016 Share Опубліковано: 1 листопада 2016 интеграция seo_pro Надіслати Поділитися на інших сайтах More sharing options... Назад 58 59 60 61 62 63 64 65 66 67 68 Вперед Сторінка 63 з 72 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 4
Recommended Posts