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

SEO url


Recommended Posts

Здравствуйте, подобная тема уже есть на форуме, но там решение есть только для более поздних версий OpenCart.

Нужно вместо:

http://www.site.ru/Главная_категория1/Подкатегория1
http://www.site.ru/Главная_категория1/Подкатегория2
http://www.site.ru/Главная_категория1/Подкатегория3

Это:

http://www.site.ru/Подкатегория1
http://www.site.ru/Подкатегория2
http://www.site.ru/Подкатегория3

Использую OpenCart 1.4.9.4

Заранее спасибо.

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


Вот сам класс seo:

<?php
class ModelToolSeoUrl extends Model {
	public function rewrite($link, $action = '') {
		if (!$this->config->get('config_seo_url')) return $link;

		$url_query = parse_url(str_replace('&', '&', $link), PHP_URL_QUERY);

		$data = array();
		parse_str($url_query, $data);

		$seo_url_postfix = ($this->config->get('config_seo_url_auto') == '1') ? '/' : '';

		if (array_key_exists('product_id', $data)) {
			$url = $this->getProductSeoUrl($data['product_id']);

			if ($this->config->get('config_seo_url_replace')) {
				$url = str_replace(' ', '_', $url);
			}

			if (strpos($url, '&') === false) $url .= $seo_url_postfix;

			return rtrim(HTTP_SERVER, '/') . str_replace('&', '&', $url);
		} elseif (array_key_exists('path', $data)) {
			$parts = explode('_', $data['path']);
			$category_id = array_pop($parts);
			$path = $this->getPath($category_id);

			if ($path === false && $action == 'validate') return false;

			if ($data['path'] != $path) {
				$data['path'] = $path;
				$link = HTTP_SERVER . 'index.php?' . urldecode(http_build_query($data));
			}
		}

		$url = '';
		foreach ($data as $key => $value) {
			switch ($key)
			{
				case 'manufacturer_id':
				case 'information_id':
					$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");

					if ($query->num_rows) {
						$url .= '/' . $query->row['keyword'];

						unset($data[$key]);
					}
					break;

				case 'path':
					$seo_path = $this->getSeoPath($value);

					if (!$seo_path) return $link;

					$url .= $seo_path;

					unset($data[$key]);
					break;

				default:
					break;
			}
		}

		if (!$url) return $link;

		unset($data['route']);

		$query = sizeof($data) ? '?' . urldecode(http_build_query($data)) : '';

		if ($this->config->get('config_seo_url_replace')) {
			$url = str_replace(' ', '_', $url);
		}

		$url = str_replace('&', '&', $url);

		return rtrim(HTTP_SERVER, '/') . $url . $seo_url_postfix . $query;
	}


	private function getPath($category_id) {
		$category_id = (int)$category_id;
		if ($category_id < 1) return false;

		$path = $this->cache->get('category.seo.path.' . $category_id . '.' . (int)$this->config->get('config_store_id'));

		if ($path === null) {
			$path = '';

			$max_level = 30;

			$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 = $query->num_rows ? $query->row['path'] : false;

			$this->cache->set('category.seo.path.' . $category_id . '.' . (int)$this->config->get('config_store_id'), $path);
		}

		return $path;
	}


	private function getSeoPath($path) {
		$seo_path = $this->cache->get('category.seo.' . $path . '.' . (int)$this->config->get('config_store_id'));

		if ($seo_path === null) {
			$seo_path = '';

			$categories = explode('_', $path);

			foreach ($categories as $category) {
				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");

				if ($query->num_rows) {
					$seo_path .= '/' . $query->row['keyword'];
				} else {
					$seo_path = false;
					break;
				}
			}

			$this->cache->set('category.seo.' . $path . '.' . (int)$this->config->get('config_store_id'), $seo_path);
		}

		return $seo_path;
	}


       private function getProductSeoUrl($product_id) {
		$product_id = (int)$product_id;
		if ($product_id < 1) return false;

		$seo_url = $this->cache->get('product.seo.' . $product_id . '.' . (int)$this->config->get('config_store_id'));

		if ($seo_url === null) {
			$seo_url = false;

			$query = $this->db->query("SELECT IFNULL(p.main_category_id, p2c.category_id) AS category_id FROM " . DB_PREFIX . "product AS p JOIN " . DB_PREFIX . "product_to_category AS p2c USING (product_id) WHERE p.product_id = '" . (int)$product_id . "' LIMIT 1");

			if ($query->num_rows) {
				$category_id = (int)$query->row['category_id'];
				if ($path = $this->getPath($category_id)) {
					$product_alias = '';
					if ($seo_path = $this->getSeoPath($path)) {
						$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'product_id=" . $product_id . "'");

						if ($query->num_rows) $product_alias = $query->row['keyword'];
					}
					if ($product_alias) {
						$seo_url = $seo_path . '/' . $product_alias;
					} else {
						$seo_url = '/index.php?route=product/product&path=' . $path . '&product_id=' . $product_id;
					}
				}
			}

			$this->cache->set('product.seo.' . $product_id . '.' . (int)$this->config->get('config_store_id'), $seo_url);
		}

		return $seo_url;
	}

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


по-моему в версии 0.2.0 это делается из админки, возможно еще нужно установить этот модуль https://opencartforum.com/files/file/75-устранение-дублей-страниц-товаров-и-категорий/

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


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

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

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

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

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

Вхід

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

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

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

×
×
  • Створити...

Important Information

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