11  /  12

Настройка редиректов со старых URL на новые

Когда сайт долгое время находился без внимания SEO-специалистов, то очень часто возникает задача поменять существующие адреса товаров на новые.

Но к этому процессу нужно подходить деликатно. Было бы ошибкой просто поменять пути к товарам, т.к. многие элементы уже могли проиндексировать в поисковых системах, таких как Google или Яндекс. Необходимо настроить 301-редиректы со старых УРЛ на новые. Когда товаров действительно много, то прописать вручную все редиректы в .htaccess не очень удобно и правильно, т.к. при слишком большом объеме этого файла ничего хорошего не следует.

Один из возможных способов решения такой задачи это программирование небольшого скрипта и, конечно, не без помощи модуля Инструменты, коллекции, групповые действия. С помощью модуля вопрос решается в несколько этапов:

1) Создается служебное свойство в инфоблоке товаров (каталог), типа Строка. Например Старый URL товаров с символьным кодом SC_DETAIL_PAGE_URL.

2) В созданное новое свойство и записывается текучие пути к товарам. Как это сделать?

Тут и подключается модуль Инструменты, коллекции, групповые действия.

Внимание! Убедитесь, что в настройках инфоблока товаров шаблон URL страницы детального просмотра задан верный и соответствует текучим URL.

Необходимо создать коллекцию с действием Групповое редактирование значений свойств с заменой макросов, в дополнительных полях указать DETAIL_PAGE_URL, чтобы данное поле было доступно для замены макросов, выбрать нужно свойство, куда будем записывать текучие URL (см. пункт 1), для присваиваемых значений этого свойства в коллекции указать #DETAIL_PAGE_URL#. После сохранения коллекции выполнить переиндексацию.

ЗАПИСЬ СТАРЫХ URL В СВОЙСТВО


Таким образом в свойства товаров Старый URL товаров запишутся их пути, например: /catalog/ELEMENT_CODE1/, /catalog/ELEMENT_CODE1/ и т.д.

На этом работа модуля заканчиваются. Далее необходимо прописать скрипт переадресации, который будет проверять текучий URl посетителя. И, если он старый, то находить новый адрес товара и направлять автоматически на новый.


3) В настройках инфоблока товаров шаблон URL страницы детального просмотра поменять на новый, т.е. на такой, какими должны быть новые адреса товаров.

4) Написать скрипт переадресации предлагаем  в обработчике событий главного модуля 1С-Битрикс  OnBeforeProlog. Наш вариант представлен ниже:

// файл /bitrix/php_interface/init.php
AddEventHandler("main", "OnBeforeProlog", Array("CScoderClass", "OnBeforePrologHandler"));
class CScoderClass
{
	const IBLOCK_CATALOG_ID = 1; 		//TODO - ИД вашего каталога
	const CACHE_TIME = 36000000000; 	//TODO - время жизни кэша
	function OnBeforePrologHandler()
	{
		global $USER,$APPLICATION;
		$page = $APPLICATION->GetCurPage(false);
		//проверяем УРЛ. Редирект со старых УРЛ товаров
		if (stripos($page,'/catalog/')===0)
		{
			$ar_exp = explode("/",$page);
			if (count($ar_exp)>=4)
			{
				$arSelect = Array("ID", "IBLOCK_ID","NAME", "DETAIL_PAGE_URL");
				$filter = Array(
					"IBLOCK_ID"=>self::IBLOCK_CATALOG_ID,
					"ACTIVE_DATE"=>"Y",
					"ACTIVE"=>"Y",
					"PROPERTY_SC_DETAIL_PAGE_URL" => $page,
				);

				//Запрос с кешированием
				$cache = new CPHPCache();
				$cache_time = self::CACHE_TIME;
				$cache_id = 'sc_element_'.serialize($filter);
				$cache_path = '/scoder/iblock/';
				if ($cache_time > 0 && $cache->InitCache($cache_time, $cache_id, $cache_path))
				{
					$res = $cache->GetVars();
					if (is_array($res["arFields"]) && (count($res["arFields"]) > 0))
					$arFields = $res["arFields"];
				}
				if (!isset($arFields))
				{
					$res = CIBlockElement::GetList(Array("ID"=>"ASC"), $filter, false, Array("nTopCoumt"=>1), $arSelect);
					if($ob = $res->GetNextElement())
					{
						$arFields = $ob->GetFields();
					}

					if ($cache_time > 0)
					{
						$cache->StartDataCache($cache_time, $cache_id, $cache_path);
						$cache->EndDataCache(array("arFields"=>$arFields));
					}
				}
				if (is_array($arFields) && strlen($arFields['DETAIL_PAGE_URL'])>0)
				{
					if ($page != $arFields["DETAIL_PAGE_URL"])
					{
						LocalRedirect($arFields["DETAIL_PAGE_URL"], false, "301 Moved Permanently");
					}
				}
			}
		}
	}
}
Внимание! На момент подключения скрипта в настройках инфоблока товаров шаблон URL страницы детального просмотра должен быть уже изменен на новый (пункт 3).