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

gkorepanovgk

Новачок
  
  • Публікації

    7
  • З нами

  • Відвідування

gkorepanovgk's Achievements

Rookie

Rookie (2/14)

  • First Post
  • Conversation Starter
  • Week One Done
  • One Month Later
  • One Year In

Recent Badges

5

Репутація

  1. На вкус и цвет все фломастеры разные :) Мне нравится именно так, и я считаю, что это семантически правильно, хотя никому этого доказывать не собираюсь. Я создал эту тему лишь потому, что видел только на этом форуме около 5 тем, где авторы были озадачены именно избавлением от id-шников. Может, кому-нибудь когда-нибудь пригодится. Сам файл (версия последняя из ocstore, вручную seo pro не скачивал): seo_pro.php seo_pro.php
  2. Не спорю. Но учитывая, что при 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']); } } }
  3. Во-первых, я написал для удобства, всем и так понятно. Во-вторых, предпочитаю clothes/men/jacket
  4. Надоели ЧПУ вида (или ЧПУ с 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 (только не в пределах одной категории).
  5. Смотрите в сторону этого модуля: https://opencartforum.com/files/file/1074-napominanie-o-platezheotlozhennyi-platezh/ Минимальный допил под ваши нужды - и будет идеальное решение.

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

Important Information

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