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

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

Добрый день,
КАК привести ссылки с товаром к виду mysiteTEST.com/zzzz/keyword

где zzzz не название категории, а просто префикс у всех одинаковый.

 

(ЧПУ товаров с категориями:/category/subcategory/product) отключен.

 

Спасибо.

Изменено пользователем leperrR

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


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

Решение для SeoPro.

Я вообще не понимаю зачем это вам. Вы используете это решение на свой страх и риск, и не факт, что оно у Вас сработает!!!
 
Теория.

При обработке GET переменной product_id необходимо добавить перед запросом seo-url товара предзапрос для получения суффикса zzzz. Чтобы получилось так:

$quires[] = 'product_suffix';
$quires[] = 'product_id=42';

А в БД, в таблице oc_url_alias значения запросов равны:

'product_suffix' = 'zzzz'
'product_id=42' = 'test'

Т.е. у нас должна сформироваться ссылка /zzzz/test.html

Решение.

Файл controller/catalog/common/seo_pro.php, ищем:

$queries = array();
foreach ($data as $key => $value) {
	switch ($key) {
		case 'product_id':
		case 'manufacturer_id':
		case 'category_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;

		default:
			break;
	}
}

 
Добавляем:
 

$queries = array();
foreach ($data as $key => $value) {
	switch ($key) {
		case 'product_id':
			// Добавляем предзапрос на поиск суффикса zzzz
			$queries[] = 'product_suffix';
			$queries[] = $key . '=' . $value;
			unset($data[$key]);
			$postfix = 1;
			break;
			// конец
		case 'manufacturer_id':
		case 'category_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;

		default:
			break;
	}
} 

Все готово. Могут быть разные версии seo_pro, но я в них не разбираюсь, так что у некоторых на странице товаров может возникать ошибка Undefined offset:  1 in catalog\controller\common\seo_pro.php on line 42 Тем, у кого возникает эта ошибка необходимо заменить:

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];
		}
	} else {
		$this->request->get[$url[0]] = $url[1];
	}
}

На:

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];
		}
	} else {
		// Добавляем проверку 
		if ($url[0] !== 'product_suffix') {
			$this->request->get[$url[0]] = $url[1];
		}
		// конец
	}
}

Теперь в таблицу oc_url_alias нужно добавить poduct_suffix=zzzz, это можно сделать с помощью запроса:

INSERT INTO `oc_url_alias` (`query`, `keyword`) VALUES
('product_suffix', 'zzzz');
  • +1 1

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


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

 

Решение для SeoPro....

Спасибо за решение!

Для чего ВЫ спрашивали? Чтобы не потерять проиндексированные ссылки действующего ИМ, не потерять рейтинг.

 

Протестил способ, не каких ошибок пока не заметил...... "не по теме" но когда заливаю больше 1 тыс товара очень долго начинает грузится странички товара и  категорий порядка 10-30 сек, даже когда отключаю этот метод product_suffix  все равно весит... использую на  "Шаблон RUBBER".

 

вот еще один метод Change Product Url

он для базового чуть переделанного seo_url

вот код замена SeoPro:

<?php 
class ControllerCommonSeoUrl extends Controller {
    /* SEO Custom URL */
    private $url_list = array (
        'common/home'       => '',
        'checkout/cart'     => 'cart',
        'account/register'  => 'register',
                    'account/wishlist'  => 'wishlist',
                    'checkout/checkout' => 'checkout',
                    'account/login'     => 'login',
                    'product/special'   => 'special',
                    'affiliate/account' => 'affiliate',
                    'checkout/voucher'  => 'voucher',
                    'product/manufacturer' => 'brand',
                    'account/newsletter'   => 'newsletter',
                    'account/order'        => 'order',
                    'account/account'      => 'account',
                    'information/contact'  => 'contact',
                    'account/return/insert' => 'return',
                    'information/sitemap'   => 'sitemap',
        );
    /* SEO Custom URL */

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_']);

        foreach ($parts as $part) {
            $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");

            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];
                }   
            } else {
                $this->request->get['route'] = 'error/not_found';   
            }
        }
                    /* SEO Custom URL */
                    if ( $_s = $this->setURL($this->request->get['_route_']) ) {
                            $this->request->get['route'] = $_s;
                    }/* SEO Custom URL */

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

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

public function rewrite($link) {
    $url_info = parse_url(str_replace('&', '&', $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 . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");

                if ($query->num_rows) {
                    $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 . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");

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

                unset($data[$key]);
            }
                                    /* SEO Custom URL */
                                    if( $_u = $this->getURL($data['route']) ){
                                        $url .= $_u;
                                        unset($data[$key]);
                                    }/* SEO Custom URL */       


        }
    }

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

        $query = '';

        if ($data) {
            foreach ($data as $key => $value) {
                $query .= '&' . $key . '=' . $value;
            }

            if ($query) {
                $query = '?' . 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;
    }
}   
    /* SEO Custom URL */
    public function getURL($route) {
            if( count($this->url_list) > 0) {
                 foreach ($this->url_list as $key => $value) {
                    if($route == $key) {
                        return '/'.$value;
                    }
                 }
            }
            return false;
    }
    public function setURL($_route) {
            if( count($this->url_list) > 0 ){
                 foreach ($this->url_list as $key => $value) {
                    if($_route == $value) {
                        return $key;
                    }
                 }
            }
            return false;
    }/* SEO Custom URL */
}
?>

заменяем 99 строку:

 

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 . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");
       
                if ($query->num_rows) {
       // Добавляем суффикс zzzz
                    $url .= '/zzzz/' . $query->row['keyword'];
      // конец
                    unset($data[$key]);
                }                   

в итоге выходит домен/категория/подкатегория/zzzz/test

только остается убрать категория/подкатегория (без родителя) - чтобы было домен/zzzz/test

как убрать категорию я еще думаю...

 

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


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

А как вы увидели связь product_suffix с производительностью? Еее нет. Добавьте индексы в БД, отключите подсчет кол-ва товаров.

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


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

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

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

×

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

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