Перейти к содержанию

Рекомендуемые сообщения

Надоели ЧПУ вида (или ЧПУ с id-шниками, что само по себе убивает предназначение ЧПУ)

 

одежда/одежда_мужская/одежда_мужская_куртки/...

одежда/одежда_женская/одежда_женская_куртки/...

 

вместо 

 

одежда/мужская/куртки...

одежда/женская/куртки...

 

из-за требования уникальности seo url для каждой категории.

Решений не нашел, одно есть, но для обычного ЧПУ opencart, под SEO PRO ничего не нашел.

 

Написал свое решение. Не знаю хорошо по синтаксису ни PHP, ни SQL, так что решение "на коленке", не самое быстрое, скорее, медленное, однако, рабочее. Все идеально работает, никаких дублей нет, при написании пути без подкатегорий автоматом перенаправляет на первый товар с таким путем (для "одежда/куртки" перенаправит на "одежда/мужская/куртки", если эта категория создана раньше, чем "одежда/женская/куртки").

 

Предложения, замечания, критика приветствуется. И так, заменяем в файле /docs/catalog/controller/common/seo_pro.php

где-то на 83 строке

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

на

foreach ($parts as $keyword) {
            
                if (isset($a) && $a[0]=="category_id") {
                		$currentid = $a[1];
                    $query = $this->db->query("SELECT a.* FROM " . DB_PREFIX . "url_alias a, " . DB_PREFIX . "category c, " . DB_PREFIX . "product_to_category m WHERE a.keyword = '" . $this->db->escape($keyword) . "' AND (a.query=CONCAT('category_id=', c.category_id) OR a.query=CONCAT('product_id=', m.product_id)) AND (c.parent_id='".$currentid."'  OR m.category_id='".$currentid."')");
                    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 url (только не в пределах одной категории).

  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость brk

Надоели ЧПУ вида (или ЧПУ с id-шниками, что само по себе убивает предназначение ЧПУ)

 

одежда/одежда_мужская/одежда_мужская_куртки/...

одежда/одежда_женская/одежда_женская_куртки/...

 

вместо 

 

одежда/мужская/куртки...

одежда/женская/куртки...

 

 

Если речь пошла про ЧПУ, то так:

вместо 

 

одежда/мужская/куртки...

odezda/muzskaya/kurtki..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

во-первых, вы своим решением убиваете весь смысл кешированного seo_pro своми запросами на основе которого и делали сию доработку.

во-вторых, (код тяжело читать, может не совсем понятно что там происходит) вы обращаетесь к $this->cache_data а там все ключи как раз уникальные

 

смысл-то в чем я так не понял? нужно не уникальное ЧПУ и не нравятся цифры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если речь пошла про ЧПУ, то так:

вместо 

 

одежда/мужская/куртки...

odezda/muzskaya/kurtki..

Во-первых, я написал для удобства, всем и так понятно. 

Во-вторых, предпочитаю 

clothes/men/jacket

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

во-первых, вы своим решением убиваете весь смысл кешированного seo_pro своми запросами на основе которого и делали сию доработку.

во-вторых, (код тяжело читать, может не совсем понятно что там происходит) вы обращаетесь к $this->cache_data а там все ключи как раз уникальные

 

смысл-то в чем я так не понял? нужно не уникальное ЧПУ и не нравятся цифры?

 

Не спорю. Но учитывая, что при 2000 товаров страницы открываются менее, чем за секунду, меня пока устраивает. Время не резиновое.

 

Но все-таки решил переписать на кеширующийся вариант. Код ниже.

 

 

смысл-то в чем я так не понял? нужно не уникальное ЧПУ 

 

Да, конечно, по-моему я очень доступно написал.

 

 не нравятся цифры?

 

Не то чтобы не нравятся; они никак не добавляют "ЧПУ-шности" url'у, скорее, наоборот. Незачем пользователю внутренние id'шники видеть.

 

Вариант с кешем. Страницы стали мгновенно открываться, как и раньше, без модификаций. Работа кода не изменилась.

Меняем

$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_data = array();
			$query = $this->db->query("SELECT LOWER(a.`keyword`) as 'keyword', a.`query`, c.`parent_id` FROM " . DB_PREFIX . "`url_alias` a, " . DB_PREFIX . "`category` c WHERE a.`query`=CONCAT('category_id=', c.`category_id`)");
			
				
			foreach ($query->rows as $row) {
				if(!isset($this->cache_data['keywords'][$row['keyword']])){
					$this->cache_data['keywords'][$row['keyword']] = array();
				}
				$this->cache_data['keywords'][$row['keyword']][] = array('query' => $row['query'], 'parent' => $row['parent_id']);
				$this->cache_data['queries'][$row['query']] = $row['keyword']; 
			}
			$query = $this->db->query("SELECT LOWER(a.`keyword`) as 'keyword', a.`query`, m.`category_id` FROM " . DB_PREFIX . "`url_alias` a, " . DB_PREFIX . "`product_to_category` m WHERE a.`query`=CONCAT('product_id=', m.`product_id`)");
			
			foreach ($query->rows as $row) {
				if(!isset($this->cache_data['keywords'][$row['keyword']])){
					$this->cache_data['keywords'][$row['keyword']] = array();
				}
				$this->cache_data['keywords'][$row['keyword']][] = array('query' => $row['query'], 'parent' => $row['category_id']);
				$this->cache_data['queries'][$row['query']] = $row['keyword']; 
			}

Пришлось сделать два запроса. SQL не знаю, надо пошаманить с JOIN.

 

И это

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

заменяем на это:

foreach ($parts as $keyword) {
            
                if (isset($a) && $a[0]=="category_id") {
                		$currentid = $a[1];
                		foreach ($this->cache_data['keywords'][$keyword] as $current_keyword) {
                		
                    if ($current_keyword['parent'] == $currentid) {
                       $rows[] = array('keyword' => $keyword, 'query' => $current_keyword['query']);
                       $a = explode("=",$current_keyword['query']);
                    }
                  }
                } else {
                    if (isset($this->cache_data['keywords'][$keyword])) {
                       $rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword][0]['query']);
                       $a=explode("=",$this->cache_data['keywords'][$keyword][0]['query']);
                    }    
                }
				
			}
  • +1 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я бы не сказал, что вы что-то исправили, но вышлите свою версию файла, посмотрим.

кстати, не вижу в id'шниках ничего плохого, по моему это предрассудки

посмотрите текущий урл форума или розетку

http://rozetka.com.ua/lenovo_ideapad_s110_59366438/p265780/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кстати, не вижу в id'шниках ничего плохого, по моему это предрассудки

посмотрите текущий урл форума или розетку

 

На вкус и цвет все фломастеры разные :)

Мне нравится именно так, и я считаю, что это семантически правильно, хотя никому этого доказывать не собираюсь. Я создал эту тему лишь потому, что видел только на этом форуме около 5 тем, где авторы были озадачены именно избавлением от id-шников. Может, кому-нибудь когда-нибудь пригодится.

Сам файл (версия последняя из ocstore, вручную seo pro не скачивал):

seo_pro.php

seo_pro.php

  • +1 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я бы не сказал, что вы что-то исправили, но вышлите свою версию файла, посмотрим.

кстати, не вижу в id'шниках ничего плохого, по моему это предрассудки

посмотрите текущий урл форума или розетку

http://rozetka.com.ua/lenovo_ideapad_s110_59366438/p265780/

именно форума!!! как и к новостным сайтам к форумам другие требования чем к магазинам и требования официальные от самого дяди Гугла там обязан быть айдишник, а в магазе не обязан (только не просите ссыль искать лом). Если я правильно понял Человеку не нравится то что категория куртки в разделах мужские и женские воспринимается системой как не уникальный сеоурл, хотя если смотреть полный путь он получается вполне уникальный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

gkorepanovgk, спасибо. полезное решение.

есть еще вот такой вот модуль http://www.opencart.com/index.php?route=extension/extension/info&extension_id=6210 за 30$

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.