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

Seo_pro Категория перед товаром.


Recommended Posts

Прикрепляю мой seo_pro.php

<?php
class ControllerCommonSeoPro extends Controller {
	private $cache_data = null;
	private $languages = array();
	private $config_language;

	public function __construct($registry) {
		parent::__construct($registry);
		$this->cache_data = $this->cache->get('seo_pro');
		if (!$this->cache_data) {
			$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->set('seo_pro', $this->cache_data);
		}

		$query = $this->db->query("SELECT `value` FROM `" . DB_PREFIX . "setting` WHERE `key` = 'config_language'");
		$this->config_language = $query->row['value'];

		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language WHERE status = '1'");

		foreach ($query->rows as $result) {
			$this->languages[$result['code']] = $result;
		}

	}

	public function index() {

// language
		$code = $this->config_language;

		if(isset($this->request->get['_route_'])) {
        $route_ = $this->request->get['_route_'];
			$tokens = explode('/', $this->request->get['_route_']);

			if(array_key_exists($tokens[0], $this->languages)) {
				$code = $tokens[0];
				$this->request->get['_route_'] = substr($this->request->get['_route_'], strlen($code) + 1);
			}

			if(trim($this->request->get['_route_']) == '' || trim($this->request->get['_route_']) == 'index.php') {
				unset($this->request->get['_route_']);
			}
		}


		if(!isset($this->session->data['language']) || $this->session->data['language'] != $code) {
			$this->session->data['language'] = $code;
		}

		if(!isset($this->request->cookie['language']) || $this->request->cookie['language'] != $code) {
			setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);
		}

		$this->config->set('config_language_id', $this->languages[$code]['language_id']);
		$this->config->set('config_language', $this->languages[$code]['code']);

		$language = new Language($this->languages[$code]['directory']);
		$language->load($this->languages[$code]['filename']);
		$this->registry->set('language', $language);


		// 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);

			$rows = array();
			foreach ($parts as $keyword) {
				if (isset($this->cache_data['keywords'][$keyword])) {
					$rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]);
				}
			}

			if (count($rows) == sizeof($parts)) {
				$queries = array();
				foreach ($rows as $row) {
					$queries[utf8_strtolower($row['keyword'])] = $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];
						}
					} elseif (count($url) > 1) {
						$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';
			} else {
				if (isset($queries[$parts[0]])) {
					$this->request->get['route'] = $queries[$parts[0]];
				}
			}


			$this->validate();

			if (isset($this->request->get['route'])) {
				return $this->forward($this->request->get['route']);
			}
		}
	}

	public function rewrite($link, $code = '') {
		if(!$code) {
			$code = $this->session->data['language'];
		}
		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 'product/product/review':
			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');
		}

		if ($code != $this->config_language){
			$link .= $code . '/index.php?route=' . $route;
		} else{
			$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':
			 
			$queries[] = 'product_suffix';
			$queries[] = $key . '=' . $value;
			unset($data[$key]);
			$postfix = 1;
			break;
		 
		case 'manufacturer_id':
		case 'category_id': 
		case 'information_id':
		  
			$queries[] = 'info_suffix';
			$queries[] = $key . '=' . $value;
			unset($data[$key]);
			$postfix = 1;
			break;
		 
		case 'path':
			 
			$queries[] = 'product_suffix';
	        $postfix = 1;
		 
			$categories = explode('_', $value);
			foreach ($categories as $category) {
				$queries[] = 'category_id=' . $category;
			}
			unset($data[$key]);
			break;

		default:
			break;
	}
} 

		if(empty($queries)) {
			$queries[] = $route;
		}

		$rows = array();
		foreach($queries as $query) {
			if(isset($this->cache_data['queries'][$query])) {
				$rows[] = array('query' => $query, 'keyword' => $this->cache_data['queries'][$query]);
			}
		}

		if(count($rows) == count($queries)) {
			$aliases = array();
			foreach($rows as $row) {
				$aliases[$row['query']] = $row['keyword'];
			}
			foreach($queries as $query) {
				$seo_url .= '/' . rawurlencode($aliases[$query]);
			}
		}

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

		if($code != $this->config_language) {
			$seo_url = $code . '/' . trim($seo_url, '/');
		} else {
			$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;
		}
 
			$seo_url .= '/';
	 
		if(substr($seo_url, -2) == '//') {
			$seo_url = substr($seo_url, 0, -1);
		}

		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 (isset($this->request->get['route']) && $this->request->get['route'] == 'error/not_found') {
			return;
		}
		if(empty($this->request->get['route'])) {
			$this->request->get['route'] = 'common/home';
		}

		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))));
		}
	}
?>

Вопрос - как мне сделать ссылки на продукт вида - сайт.ру/категория/продукт

Надіслати
Поділитися на інших сайтах

а зачем вы туда полезли

есть же переключатель в админке http://take.ms/g2ajj

 

1. У меня в админке такого нет ибо стоит opencart

 

2. Через это работает по всему пути.

Надіслати
Поділитися на інших сайтах

  • 1 month later...

Подскажите, кто знает, так и должно быть?

 

В общем в настройках сайта есть 2 типа ЧПУ:

1) По умолчанию;

2) SeoPro.

 

Когда выбран первый вариант, то ссылка на товар имеет следующий вид: site.my/main_category/sub_category/product

 

Если выбрать второй вариант "SeoPro", то ссылка до этого же товара будет такой: site.my/main_category/product.html

 

Как видно во втором варианте в ссылке теряется подкатегория. Это какая то особенность SeoPro или что то не так настроено?

 

 

В настройках:

 

ЧПУ товаров с категориями:/category/subcategory/product
(только для SeoPro)                       
Стоит "ДА"

 

У меня ocStore 1.5.5.1.2.

Змінено користувачем ben2988
Надіслати
Поділитися на інших сайтах


Если ваш текст читать снизу вверх, то наверное поймете в чем проблема
 
 
1. Как видно во втором варианте в ссылке теряется подкатегория. Это какая то особенность SeoPro или что то не так настроено?
то ссылка до этого же товара будет такой: site.my/main_category/product.html

Надіслати
Поділитися на інших сайтах

Если ваш текст читать снизу вверх, то наверное поймете в чем проблема

 

 

1. Как видно во втором варианте в ссылке теряется подкатегория. Это какая то особенность SeoPro или что то не так настроено?

то ссылка до этого же товара будет такой: site.my/main_category/product.html

 

Я думаю, что при включенной "SeoPro" подкатегории в ссылке должны быть! То есть должно быть site.my/main_category/sub_category/product.html а не как сейчас - site.my/main_category/product.html

Надіслати
Поділитися на інших сайтах


Я специально выделил 

 

main_category

 

В связях  устанавливайте не только принадлежность, но и Основную категорию.

  • +1 1
Надіслати
Поділитися на інших сайтах

Я специально выделил 

 

main_category

 

В связях  устанавливайте не только принадлежность, но и Основную категорию.

Вон оно что! Спасибо за наводку. Действительно основная категория нигде не указана. Весело получается, у меня 6500 товаров в магазине :mellow: . Посоветуете может что? Установлен только модуль "Автоматическая обработка прайс листов".

 

А что если так оставить, фиг с этими подкатегориями... Или это как то на SEO или поисковиках отразиться?

Змінено користувачем ben2988
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

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