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 так, чтобы Битрикс думал, что мы находимся на обычной странице каталога с обычным выставленным фильтром.