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

Получить id категории в seo_url


AlexMax13

Recommended Posts

Можно ли как-то получить id категории в файле 
/catalog/controller/startup/seo_url.php

Содержимое файла:
 

Скрытый текст
<?php 
class ControllerStartupSeoUrl 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_'])) {
			$parts = explode('/', $this->request->get['_route_']);

			// remove any empty arrays from trailing
			if (utf8_strlen(end($parts)) == 0) {
				array_pop($parts);
			}

			foreach ($parts as $part) {
				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE keyword = '" . $this->db->escape($part) . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "'");

				if ($query->num_rows) {
					$url = explode('=', $query->row['query']);

					if ($url[0] == 'product_id') {
						$this->request->get['product_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];
						}
					}

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

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

					if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') {
						$this->request->get['route'] = $query->row['query'];
					}
				} else {
					$this->request->get['route'] = 'error/not_found';

					break;
				}
			}

			if (!isset($this->request->get['route'])) {
				if (isset($this->request->get['product_id'])) {
					$this->request->get['route'] = 'product/product';
				} 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/info';
				} elseif (isset($this->request->get['information_id'])) {
					$this->request->get['route'] = 'information/information';
				}
			}
		// Redirect 301   
		} elseif (isset($this->request->get['route']) && empty($this->request->post) && !isset($this->request->get['token']) && $this->config->get('config_seo_url')) {
			$arg = '';
			$cat_path = false;
			$route = $this->request->get['route'];

			if ($this->request->get['route'] == 'product/product' && isset($this->request->get['product_id'])) {
				$route = 'product_id=' . (int)$this->request->get['product_id'];
			} elseif ($this->request->get['route'] == 'product/category' && isset($this->request->get['path'])) {
				$categorys_id = explode('_', $this->request->get['path']);
				$cat_path = '';
				foreach ($categorys_id as $category_id) {
					$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "seo_url` WHERE `query` = 'category_id=" . (int)$category_id . "' AND `store_id` = '" . (int)$this->config->get('config_store_id') . "' AND `language_id` = '" . (int)$this->config->get('config_language_id') . "'");   
					if ($query->num_rows && $query->row['keyword'] /**/ ) {
						$cat_path .= '/' . $query->row['keyword'];
					} else {
						$cat_path = false;
						break;
					}
				}
				$arg = trim($cat_path, '/');
				if (isset($this->request->get['page'])) $arg = $arg . '?page=' . (int)$this->request->get['page'];
			} elseif ($this->request->get['route'] == 'product/manufacturer/info' && isset($this->request->get['manufacturer_id'])) {
				$route = 'manufacturer_id=' . (int)$this->request->get['manufacturer_id'];
				if (isset($this->request->get['page'])) $arg = $arg . '?page=' . (int)$this->request->get['page'];
			} elseif ($this->request->get['route'] == 'information/information' && isset($this->request->get['information_id'])) {
				$route = 'information_id=' . (int)$this->request->get['information_id'];
			} elseif (sizeof($this->request->get) > 1) {
				$args = '?' . str_replace("route=" . $this->request->get['route'].'&amp;', "", $this->request->server['QUERY_STRING']);
				$arg = str_replace('&amp;', '&', $args);
			}

			$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "seo_url` WHERE `query` = '" . $this->db->escape($route) . "' AND `store_id` = '" . (int)$this->config->get('config_store_id') . "' AND `language_id` = '" . (int)$this->config->get('config_language_id') . "'");

			if (!empty($query->num_rows) && !empty($query->row['keyword']) && $route) {
				$this->response->redirect($query->row['keyword'] . $arg, 301);
			} elseif ($cat_path) {
				$this->response->redirect($arg, 301);
			} elseif ($this->request->get['route'] == 'common/home') {
				$this->response->redirect(HTTP_SERVER . $arg, 301);
			}
		}
	}

	public function rewrite($link) {
		$url_info = parse_url(str_replace('&amp;', '&', $link));

		$url = '';

		$data = array();

		parse_str($url_info['query'], $data);

		foreach ($data as $key => $value) {
			if (isset($data['route'])) {
				if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
					$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");

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

						unset($data[$key]);
					}
				} elseif ($key == 'path') {
					$categories = explode('_', $value);

					foreach ($categories as $category) {
						$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = 'category_id=" . (int)$category . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");

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

							break;
						}
					}

					unset($data[$key]);
				} elseif ($key == 'route') {
					$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = '" . $this->db->escape($data['route']) . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
					if ($query->num_rows) /**/ {
						$url .= '/' . $query->row['keyword'];
					}
				}
			}
		}

		if ($url) {
			unset($data['route']);

			$query = '';

			if ($data) {
				foreach ($data as $key => $value) {
					$query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((is_array($value) ? http_build_query($value) : (string)$value));
				}

				if ($query) {
					$query = '?' . str_replace('&', '&amp;', trim($query, '&'));
				}
			}

			return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query;
		} else {
			return $link;
		}
	}
}

 

 

 

Мне нужно для того, чтобы исключить кое какой код только для категории с id 190.

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


if (!empty($this->request->get['path']) {
	$path = explode('_', (string)$this->request->get['path']);
	$category_id = (int)array_pop($path);
	if ($category_id == 190) {
		magic
	}
}

 

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

		$get = $this->request->get;

		if (isset($get['path']) && is_string($get['path']) && mb_substr($get['path'], -3) == '190') {
			// id 190
		}

 

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

@spectre спасибо, но не работает корректно. Срабатывает для дополнительного языка сайта, но не для основного.

вот так работает корректно для обеих версий:
 

if (strpos($this->request->get['_route_'], 'fast_buy') === false && strpos($this->request->get['_route_'], 'quick_buy') === false) {
	$this->request->get['geo_city_id'] = $url[1];
}

 

Но напрягает что нужно менять если я изменю seo_url, поэтому хотел именно по id категории

 

upd: понял что ваш вариант не работает в любом случае. пытаюсь решить.

 

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


понял в чем беда. нельзя надеятся на explode('_', (string)$this->request->get['path']);
так как он живет своей жизнью. 

сделал так:

 

if (!empty($this->request->get['path'])) {
  $udata = explode('_', (string)$this->request->get['path']);
  $sid = (int)array_pop($udata);
}

  echo '<pre>SID: ';
  var_dump($sid);
  echo '</pre>';

  if ($sid != 190) {
    if ($url[0] == 'geo_city_id') {
      $this->request->get['geo_city_id'] = $url[1];
    }
  }


и увидел что запрос дублируется. первый раз я получаю NULL и только вторым 190.

https://prnt.sc/YBTPeYVw5Oxj

 

Почему это происходит - не понятно. Но теперь понимаю что единственный вариант исключить этот код:
 

$this->request->get['geo_city_id'] = $url[1];


для категории id 190, это только с помощью seo_url.  Т.е. так:
 

if (strpos($this->request->get['_route_'], 'fast_buy') === false && strpos($this->request->get['_route_'], 'quick_buy') === false) {
	$this->request->get['geo_city_id'] = $url[1];
}

 

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


07.02.2025 в 00:39, AlexMax13 сказал:

Почему это происходит - не понятно

 

вы просто не туда вставляете код, если его нужно выполнять только для категории то нужно сначала убедиться что роут это категория и тогда уже проверять path 

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

07.02.2025 в 05:38, spectre сказал:

вы просто не туда вставляете код, если его нужно выполнять только для категории то нужно сначала убедиться что роут это категория и тогда уже проверять path 

 

Но системе фиолетово. Она в любом случае первый раз выполняет для всего кода, а второй уже содержит категорию. Даже если проверять на наличие категории и только тогда выполнять - не сработает, потому что нужный нам код выполнится в первом подходе, где нету данных о категории.

Да и вставлять код больше некуда. врядли он будет лучше работать за пределами функции)))

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


07.02.2025 в 22:36, AlexMax13 сказал:

Она в любом случае первый раз выполняет для всего кода, а второй уже содержит категорию

попросите чат гпт разъяснить вам что такое цикл

 

а вообще вы делаете какой-то адский костыль вставляя geo city id в сеопро 

 

напишите полную задачу - вам подскажут в какую сторону двигаться 

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

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

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

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

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

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

Вхід

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

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

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

Important Information

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