Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

gkorepanovgk

Newbie
  
  • Posts

    7
  • Joined

  • Last visited

gkorepanovgk's Achievements

Rookie

Rookie (2/14)

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

Recent Badges

5

Reputation

  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/ Минимальный допил под ваши нужды - и будет идеальное решение.
×
×
  • Create New...

Important Information

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