Когда сайт долгое время находился без внимания SEO-специалистов, то очень часто возникает задача поменять существующие адреса товаров на новые.
Но к этому процессу нужно подходить деликатно. Было бы ошибкой просто поменять пути к товарам, т.к. многие элементы уже могли проиндексировать в поисковых системах, таких как Google или Яндекс. Необходимо настроить 301-редиректы со старых УРЛ на новые. Когда товаров действительно много, то прописать вручную все редиректы в .htaccess не очень удобно и правильно, т.к. при слишком большом объеме этого файла ничего хорошего не следует.
Один из возможных способов решения такой задачи это программирование небольшого скрипта и, конечно, не без помощи модуля Инструменты, коллекции, групповые действия. С помощью модуля вопрос решается в несколько этапов:
1) Создается служебное свойство в инфоблоке товаров (каталог), типа Строка. Например Старый URL товаров с символьным кодом SC_DETAIL_PAGE_URL.
2) В созданное новое свойство и записывается текучие пути к товарам. Как это сделать?
Тут и подключается модуль Инструменты, коллекции, групповые действия.
Необходимо создать коллекцию с действием Групповое редактирование значений свойств с заменой макросов, в дополнительных полях указать DETAIL_PAGE_URL, чтобы данное поле было доступно для замены макросов, выбрать нужно свойство, куда будем записывать текучие URL (см. пункт 1), для присваиваемых значений этого свойства в коллекции указать #DETAIL_PAGE_URL#. После сохранения коллекции выполнить переиндексацию.
Таким образом в свойства товаров Старый URL товаров запишутся их пути, например: /catalog/ELEMENT_CODE1/, /catalog/ELEMENT_CODE1/ и т.д.
На этом работа модуля заканчиваются. Далее необходимо прописать скрипт переадресации, который будет проверять текучий 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"); } } } } } }