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

Плагин SEO Pro - Два УРЛ на одну страницу в блоге

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

Помогите пожалуйста, замучался разбираться с сео про и модулем блог.

В общем материал доступен как по ссылке

сайт.ру/категория материала/материал.html,

так и по адресу

сайт.ру/материал.html

без категории.

чувствую, где то здесь рыть надо, но не пойму где ошибка

 elseif (isset($this->request->get['record_id'])) {
                $this->request->get['route'] = 'record/record';
            } elseif (isset($this->request->get['blog_id'])) {
                $this->request->get['route'] = 'record/blog';

 

Вот мой SEOPRO файл:

<?php

class ControllerCommonSeoPro extends Controller {

    public function index() {
        // Add rewrite to url class
        if ($this->config->get('config_seo_url')) {
            $this->url->addRewrite($this);
        } else {
            return;
        }

        // Decode URL
        if (!isset($this->request->get['_route_'])) {
            $this->validate();
        } else {
            $route = $this->request->get['_route_'];
            unset($this->request->get['_route_']);
            $parts = explode('/', trim(utf8_strtolower($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[utf8_strtolower($row['keyword'])] = $row['query'];
                }

                reset($parts);
                foreach ($parts as $part) {
                    $url = explode('=', $queries[$part], 2);

                    if ($url[0] == 'news_id') {
                        $this->request->get['news_id'] = $url[1];
                    }

                    if ($url[0] == 'record_id') {
                        $this->request->get['record_id'] = $url[1];
                    }

                    if ($url[0] == 'blog_id') {
                        if (!isset($this->request->get['blog_id'])) {
                            $this->request->get['blog_id'] = $url[1];
                        } else {
                            $this->request->get['blog_id'] .= '_' . $url[1];
                        }
                    }

                    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';
            } elseif (isset($this->request->get['record_id'])) {
                $this->request->get['route'] = 'record/record';
            } elseif (isset($this->request->get['blog_id'])) {
                $this->request->get['route'] = 'record/blog';
            } elseif (isset($this->request->get['news_id'])) {
                $this->request->get['route'] = 'information/news';
            }

            $this->validate();

            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 = '';

        $component = parse_url(str_replace('&', '&', $link));

        $data = array();
        parse_str($component['query'], $data);

        $route = $data['route'];
        unset($data['route']);

        switch ($route) {
            case 'product/product':
                if (isset($data['product_id'])) {
                    $tmp = $data;
                    $data = array();
                    if ($this->config->get('config_seo_url_include_path')) {
                        $data['path'] = $this->getPathByProduct($tmp['product_id']);
                        if (!$data['path'])
                            return $link;
                    }
                    $data['product_id'] = $tmp['product_id'];
                    if (isset($tmp['tracking'])) {
                        $data['tracking'] = $tmp['tracking'];
                    }
                }
                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;

            case 'information/information/info':
                return $link;
                break;

            default:
                break;
        }

        if ($component['scheme'] == 'https') {
            $link = $this->config->get('config_ssl');
        } else {
            $link = $this->config->get('config_url');
        }

        $link .= 'index.php?route=' . $route;

        if (count($data)) {
            $link .= '&' . urldecode(http_build_query($data, '', '&'));
        }

        $queries = array();
        foreach ($data as $key => $value) {
            switch ($key) {
                case 'product_id':
                case 'manufacturer_id':
                case 'category_id':
                case 'news_id':
                case 'record_id':
                case 'information_id':
                    $queries[] = $key . '=' . $value;
                    unset($data[$key]);
                    $postfix = 1;
                    break;

                case 'path':
                    $categories = explode('_', $value);
                    foreach ($categories as $category) {
                        $queries[] = 'category_id=' . $category;
                    }
                    unset($data[$key]);
                    break;

                case 'blog_id':
                    $blcategories = explode('_', $value);
                    foreach ($blcategories as $blcategory) {
                        $queries[] = 'blog_id=' . $blcategory;
                    }
                    unset($data[$key]);
                    break;
                    
                    case 'record_id':
                    $blrecs = explode('_', $value);
                    foreach ($blrecs as $blrec) {
                        $queries[] = 'record_id=' . $blrec;
                    }
                    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 .= '/' . rawurlencode($aliases[$query]);
                }
            }
        }

        if ($seo_url == '')
            return $link;

        $seo_url = trim($seo_url, '/');

        if ($component['scheme'] == 'https') {
            $seo_url = $this->config->get('config_ssl') . $seo_url;
        } else {
            $seo_url = $this->config->get('config_url') . $seo_url;
        }

        if (isset($postfix)) {
            $seo_url .= trim($this->config->get('config_seo_url_postfix'));
        } else {
            $seo_url .= '/';
        }

        if (count($data)) {
            $seo_url .= '?' . urldecode(http_build_query($data, '', '&'));
        }

        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];
    }

    private function validate() {
        if (empty($this->request->get['route']) || $this->request->get['route'] == 'error/not_found') {
            return;
        }

        if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
            return;
        }

        if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
            $url = str_replace('&', '&', $this->config->get('config_ssl') . ltrim($this->request->server['REQUEST_URI'], '/'));
            $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'SSL'));
        } else {
            $url = str_replace('&', '&', $this->config->get('config_url') . ltrim($this->request->server['REQUEST_URI'], '/'));
            $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'NONSSL'));
        }

        if (rawurldecode($url) != rawurldecode($seo)) {
            header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently');

            $this->response->redirect($seo);
        }
    }

    private function getQueryString($exclude = array()) {
        if (!is_array($exclude)) {
            $exclude = array();
        }

        return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude))));
    }

}

?>

 

Большое спасибо откликнувшимся!

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


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

к автору блога.

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


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.

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

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

×

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

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