+7 495 989-45-50
11.08.2014 Разработки

Страницы производителей с «правильными» URL

Необходимо сформировать ЧПУ для конкретного производителя вида: /код-производителя/раздел-товаров/подраздел-товаров/, чтобы поисковые системы индексировали как саму страницу с описанием производителя, так и результат поиска товаров по конкретному производителю в общем каталоге для CMS 1C-Bitrix, учитывая стандартный функционал системы поиска (фильтрации) по каталогу.

В кратце, чтобы объяснить смысл данного действия приведу пример работы функционала.

Вот обычная отфильтрованная по производителю страница раздела "Сухие корма".
УРЛ не красивый и более того, поисковый робот не умеет пользоваться фильтром и не заиндексирует данную страницу, однако запрос "Сухой корм Acana" - достаточно популярен.
Мы делаем раздел производителей. Вот например страница производителя "Acana".
На этой странице прописан список разделов в которых есть товары Акана (и откуда робот будет их индексировать). Открываем "Сухой корм".
Получаем страницу с красивым УРЛ, по сути страницу того же каталога с тем же компонентом, точно так же отфильтрованную по производителю стандартным фильтром, но с другим УРЛ.

Создание структуры

  1. Создадим раздел в структуре сайта для просмотра информации по конкретному производителю.
  2. Далее создадим файл, который будет выводить эту информацию.
Пример: /brand/index.php

Создадим свойство в инфоблоке с товарами

  1. Имя свойства: Производитель
  2. Код свойства: BRAND
  3. Тип свойства: привязка к элементам ИБ(производители)
  4. Показывать в умном фильтре: Да

.urlrewrite.php

В файле .urlrewrite.php создадим правило обработки запроса:

		array(
			"CONDITION" => "#^/brand/([^\\/]+)((/\\?([^@]+))|/\$|\$)#",
			"RULE" => "BRAND_CODE=\$1",
			"ID" => "",
			"PATH" => "/brand/index.php",
		),
	

В итоге, при запросе /brand/manufactory/ у нас будет открываться страница /brand/index.php c доступной REQUEST-переменной $_REQUEST[BRAND_CODE] = 'manufactory'. Далее, используя эту переменную, можно вывести всю информацию, касающуюся непосредственно этого производителя, например, список разделов, где встречаются товары данного производителя.

Формирование запроса фильтрации

Теперь необходимо сформировать запрос фильтрации по производителю НО с нужным нам URL:

  1. необходимо установить модуль aseo (в общем то можно обойтись и без модуля, прописав собственный urlrewrite.php, но мы рассмотрим модификацию на примере модуля)
  2. модифицировать .htaccess в корне сайта
    Вместо:
    				
    					Options +FollowSymLinks
    					RewriteEngine On
    					RewriteCond %{REQUEST_FILENAME} !-f
    					RewriteCond %{REQUEST_FILENAME} !-l
    					RewriteCond %{REQUEST_FILENAME} !-d
    					RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
    					RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
    				
    
    Это:
    				
    					Options +FollowSymLinks
    					RewriteEngine On
    					 RewriteCond %{REQUEST_FILENAME} !-f
    					RewriteCond %{REQUEST_FILENAME} !-l
    					RewriteCond %{REQUEST_FILENAME} !-d
    					   RewriteCond %{REQUEST_FILENAME} !/bitrix/js/ipol.aseo/urlrewrite.php$ 
    					RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
    					RewriteRule ^(.*)$ /bitrix/js/ipol.aseo/urlrewrite.php [L]
    					RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
    					
    			
  3. Модифицировать файл /bitrix/js/ipol.aseo/urlrewrite.php — добавить строки начиная с 33 строки
    				if(!$requestUri) {
    
    					$pattern = '/brand\/([^\/]+)\/([^\?]+)/';
    					preg_match($pattern, $_SERVER['REQUEST_URI'], $matches);
    				
    						if(count($matches) > 0) {
    			
    							$requestUri = '/catalog/'.$matches[2];
    			
    							$GLOBALS['CurrentBrend'] = urldecode($matches[1]);
    			
    						}
    				}				
    			
    Этим самым, с помощью модуля aseo и незначительной его модификации, мы переопределяем $_SERVER["REQUEST_URI"] перед вызовом стандартного urlrewrite.php и компонента bitrix:catalog для того, чтобы запрос вел на обыную витрину каталога. А также сохраняем в глобальной переменной код производителя.

  4. Далее нам нужно выставить фильтр по производителю. Переменная запроса в фильтре формируется по формуле:
    			
    				arrFilter_{ID_PROPERTY}_abs(crc32(urldecode({BRAND_ID})
    			
    				{ID_PROPERTY} – ID свойства инфоблока, можно поссмотреть в админке.
    				{BRAND_ID} — ID производителя
    			
    Таким образом перед вызовом компонента bitrix:catalog ставим код:
    				if(!empty($GLOBALS['CurrentBrend'])) {
    
    						$IBLOCK_ID = 33;
    						$arSelect = Array("ID");
    						$arFilter = Array("IBLOCK_ID"=>$IBLOCK_ID, "CODE"=>$GLOBALS['CurrentBrend']);
    						$res = CIBlockSection::GetList(Array(), $arFilter, false, Array("nTopCount"=>1), $arSelect);
    					
    					if($ob = $res->GetNextElement())
    					{
    						 $arFields = $ob->GetFields();
    						$BRAND_ID = $arFields['ID'];
    					}	
    					
    					$BRAND_CRC = abs(crc32(urldecode($BRAND_ID)));
    					$_GET['arrFilter_110_'.$BRAND_CRC] = "Y";
    					$_GET['set_filter'] = "Применить";
    					
    				}
    
    					$IBLOCK_ID – id инфоблока с производителями
    			
В итоге мы получили страницы типа /brand/manufactory/ - с описанием конкретного производителя. И страницы /brand/manufactory/category/ - ведущие на витрину товаров в раздел "category", отфильтрованную по производителю "manufactory".
Пример такой схемы работы можно увидеть на сайте ruspet.ru на странице бренда Acana. А вот и отфильтрованная страница раздела: http://ruspet.ru/brand/acana/sobaki/

То есть мы получили отфитрованную страницу по красивому УРЛ не модифицируя компонент или фильтр, а лишь заменив REQUEST_URI в массиве SERVER так, чтобы Битрикс думал, что мы находимся на обычной странице каталога с обычным выставленным фильтром.


Автор: webzone
Баннеры Мобильные приложения