SEO Pack Pro + нормальный SEO URL

Тема в разделе "OpenCart", создана пользователем Vor704, 4 ноя 2013.

  1. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    Здравствуйте. Для того чтобы отображать местоположение товара (категорию) нужен правильный seo_url.php, тогда ссылка получается сайт/категория/субкатегория/товар.html. Тогда и хлебные крошки работают нормально и категорию отображает в модуле категорий на странице товара.

    Вопрос. Возможно ли поставить SEO Pack Pro и сохранить нормальный SEO URL? У меня не получается. стоит ли продолжать ковырять код? возможно ли это? как?
     
  2. NinoZombie

    NinoZombie

    Регистрация:
    27 окт 2013
    Сообщения:
    223
    Симпатии:
    61
    Админка -- Каталог -- SEO -- SEOPack
    Поле SEO Urls Generator уберите параметр .html
    Надеюсь что правильно понял вопрос
     
    Vor704 нравится это.
  3. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    по ходу нет. в опене при переходе с главной на товар, ссылка на страницу имеет вид сайт/товар.html - это проблема опена, тогда, не отображает категории в модуле категорий и хлебных крошках. Лечится заменой файла seo_url.php. После замены ссылка получается сайт/категория/субкатегория/товар.html
    Когда ставлю SEO Pack Pro ошибки, потому что написан он под другой seo_url.php не тот что я заливаю. То есть, или не работает SEO Pack Pro, или формирует не полный урл, либо это я что то не то делаю?
     
    Последнее редактирование: 4 ноя 2013
  4. NinoZombie

    NinoZombie

    Регистрация:
    27 окт 2013
    Сообщения:
    223
    Симпатии:
    61
    Можно ссылку на сайт? Не совсем понятно какого рода ошибки и что работает не так как надо...
    Лично у меня, после установки SEO Pack Pro все так и осталось, как было (с точки зрения посетителя):
    Если заходишь на товар напрямую (напр. с модуля "Последние"), то ссылка вида site.ru/product
    Если заходишь сначала в категорию, потом в подкатегорию и в ней открываешь товар, то ссылка вида site.ru/category/subcategory/product
     
  5. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    Так о чем я и говорю!!!! Я могу скинуть Вам seo_url.php который это поправит и тогда ссылка будет site.ru/category/subcategory/product. но тогда перестает работать SEO Pack Pro.

    сайт на денвере.
     
  6. NinoZombie

    NinoZombie

    Регистрация:
    27 окт 2013
    Сообщения:
    223
    Симпатии:
    61
    Хм, теперь понял вопрос, но ответ на него мне сейчас не известен.
    Интересно было бы посмотреть на этот файлик.
    Может быть стоит порыться в этих самых модулях на главной, а не в нем?
     
  7. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    Проблема не в модулях, проблема именно в урл. Если у вас нормально стоит SEO Pack Pro, пожалуйста, попробуйте поменять свой /catalog/controller/common/seo_url.php на этот

    Код:
    <?php
    class ControllerCommonSeoUrl extends Controller {
        public function index() {
            // Add rewrite to url class
            if ($this->config->get('config_seo_url')) {
                $this->url->addRewrite($this);
            }
    
            // Decode URL
            if (isset($this->request->get['_route_'])) {
                $route = urldecode($this->request->get['_route_']);
                unset($this->request->get['_route_']);
                $route = mb_strtolower($route, 'UTF-8');
                $parts = explode('/', trim($route, '/'));
                list($last_part) = explode('.', array_pop($parts));
                array_push($parts, $last_part);
    
                $keyword_in = array_map(array($this->db, 'escape'), $parts);
                $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword IN ('" . implode("', '", $keyword_in) . "')");
    
                if ($query->num_rows == sizeof($parts)) {
                    $queries = array();
                    foreach ($query->rows as $row) {
                        $queries[mb_strtolower($row['keyword'], 'UTF-8')] = $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];
                            }
                        } else {
                            $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';
                } 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 = '';
    
            $url_query = parse_url(str_replace('&amp;', '&', $link), PHP_URL_QUERY);
    
            $data = array();
            parse_str($url_query, $data);
    
            $route = $data['route'];
            unset($data['route']);
    
            switch ($route) {
                case 'product/product':
                    if (isset($data['product_id'])) {
                        $product_id = $data['product_id'];
                        $data = array();
                        if ($this->config->get('config_seo_url_include_path')) {
                            $data['path'] = $this->getPathByProduct($product_id);
                            if (!$data['path']) return $link;
                        }
                        $data['product_id'] = $product_id;
                    }
                    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;
    
                default:
                    break;
            }
    
            $seo_link = http_build_query(array_merge(array('route' => $route), $data), '', '&amp;');
            $seo_link = HTTP_SERVER . 'index.php?' . urldecode($seo_link);
    
            $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]);
                        break;
    
                    case 'path':
                        $categories = explode('_', $value);
                        foreach ($categories as $category) {
                            $queries[] = 'category_id=' . $category;
                        }
                        unset($data[$key]);
                        break;
    
                    default:
                        break;
                }
            }
    
            if (!empty($queries)) {
                $query_in = array_map(array($this->db, 'escape'), $queries);
                $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` IN ('" . implode("', '", $query_in) . "')");
    
                if ($query->num_rows == count($queries)) {
                    $aliases = array();
                    foreach ($query->rows as $row) {
                        $aliases[$row['query']] = $row['keyword'];
                    }
                    foreach ($queries as $query) {
                        $seo_url .= '/' . $aliases[$query];
                    }
                }
            }
    
            if ($seo_url == '') return $seo_link;
    
            $seo_url .= trim($this->config->get('config_seo_url_postfix'));
            $seo_url .= count($data) ? '?' . urldecode(http_build_query($data)) : '';
            $seo_url = rtrim(HTTP_SERVER, '/') . $seo_url;
    
            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];
        }
    }
    ?>

    по возможности отпишитесь. спасибо.
     
    Последнее редактирование: 4 ноя 2013
  8. NinoZombie

    NinoZombie

    Регистрация:
    27 окт 2013
    Сообщения:
    223
    Симпатии:
    61
    После замены файла, с модулей главной страницы перенаправляет на пустые страницы по адресу site.ru/product . Если заходить в категорию, затем в подкатегорию, а оттуда переходить на страницу товара, то ссылка делается такой же (site.ru/product) и страница, соответственно, пустая. Ранее эти страницы обладали содержимым
     
  9. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    У меня на рабочем сайте посмотрите без SEO Pack Pro но с seo_url.php


    вот пытаюсь добиться того же результата но с SEO Pack Pro. Возможно его можно как нибудь настроить? или у меня рабочий но не тот seo_url.php, кароч ХЗ.
     
  10. NinoZombie

    NinoZombie

    Регистрация:
    27 окт 2013
    Сообщения:
    223
    Симпатии:
    61
    Посмотрите лог вкьюмода, может не находит нужных строчек какой-либо мод.
     
  11. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    єти ошибки я уже заметил еще до создания темы, поэтому спросил
    то есть ошибки я отследил и придется переписывать. было бы это просто, то взял бы и переписал, но поскольку я с ПХП на расстоянии, придется немного учится, что существенно затянет процесс установки и напряжет заказчика. поэтому и спросил, возможно были случаи и возможно уже есть "велосипед"
     
  12. Pelmen

    Pelmen Guest

    Думается мне, что проблема в настройках.
    У меня сеопак и ссылки все нормальные. pirrka.ru
     
  13. bawan

    bawan

    Регистрация:
    15 дек 2012
    Сообщения:
    102
    Симпатии:
    11
    А почему просто не поставть SeoPro и deatcow? Эта связка точно рабочая.
    Или в сеопак еще какие-то другие функции есть?
     
  14. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    а можно Ваш файл seo_url.php. какая версия? потому что тут, уже говорили об этом
     
    Последнее редактирование: 5 ноя 2013
  15. Pelmen

    Pelmen Guest

  16. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    Разобрался:frantic:
    В стандартную сборку ocStore 1.5.5.1.1 входит файл seo_pro.php, при выборе которого в настройках Тип ЧПУ: и можно выбрать вариант ЧПУ товаров с категориями: /category/subcategory/product (только для SeoPro). При этом некоторые функции SEO Pack Pro не работают, поскольку им нужно использование файла seo_url.php. У Вас например на сайте pirrka.ru, не работают SEO Friendly Urls.

    У меня такая связка стояла до того. Работает отлично. До єтого доставил SEO Pack Pro поскольку да, єсть некоторые функции которые мне были нужны.

    В конечном итоге. Поставил SEO Pro, в настройках выбрал ЧПУ товаров с категориями, окончание .html. Поверх доставил SEO Pack Pro, далее
    К сожалению, пока что, заставить работать SEO Friendly Urls так и не выходит.
     
  17. Pelmen

    Pelmen Guest

    Я их и не делал :Smile:
     
  18. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    После установки второго языка, подключения из opencartseopackprov4.2 - for OC 1.5.1.3 - 1.5.3.1.zip файла ML_seo_keywords.xml, SEO Pack Pro перестал работать вовсе, ссылки вернулись в прежний вид index.php?route=product/product&.....

    Сам vqmod файл выдает ошибку о отсутствии файла catalog/controller/module/language.php и не странно, поскольку такой файл в сборку Opencart 1.5.1.3 не входит вовсе.
    Работать он и не будет, поскольку для работы тоже использует файл seo_url.php, который я отключил в настройках.

    Под рукой была версия 1.5.4.1, скопировал файл catalog/controller/module/language.php на сайт, в настройках Тип ЧПУ выбрал seo_url.php, ссылки на сайте обрели ЧПУ вид, НО перестал работать ЧПУ товаров с категориями: /category/subcategory/product и отображение категории в модуле категорий и хлебных крошках опять не работает.

    Вернулся к тому с чего начинал. Нужно править seo_url.php.

    Не знаю как. Подскажите пожалуйста.
     
  19. bawan

    bawan

    Регистрация:
    15 дек 2012
    Сообщения:
    102
    Симпатии:
    11
    А если не секрет, то что именно там так нужно?
     
  20. Vor704

    Vor704

    Регистрация:
    2 июл 2013
    Сообщения:
    130
    Симпатии:
    25
    Related Products Generator
    SEO Friendly Urls Generator
    Auto create Meta Keywords for products on insert if meta keywords don't exist
    Auto create Meta Descriptions for products on insert if meta descriptions don't exist
    Auto create Tags for products on insert if tags don't exist
    SEO Images
    Auto Links
    SEO Editor
     
    Inso нравится это.