Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Моя небольшая доработка


Recommended Posts

Надоели ЧПУ вида (или ЧПУ с 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
Надіслати
Поділитися на інших сайтах


Надоели ЧПУ вида (или ЧПУ с 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/

Надіслати
Поділитися на інших сайтах

  • 3 weeks later...

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

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

 

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

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

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

seo_pro.php

seo_pro.php

  • +1 2
Надіслати
Поділитися на інших сайтах


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

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

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

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

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

Надіслати
Поділитися на інших сайтах


  • 3 months later...

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.