Jump to content

Recommended Posts

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

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

 

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

 

Спасибо.

Edited by leperrR

Share this post


Link to post
Share on other sites

Решение для 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

Share this post


Link to post
Share on other sites

 

Решение для 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

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

 

Share this post


Link to post
Share on other sites

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

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.