Jump to content
Sign in to follow this  
agragregra

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

Recommended Posts

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

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

сайт.ру/категория материала/материал.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))));
    }

}

?>

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.