@Alexander_AC

Как настроить redirect после смены ЧПУ для подразделов каталога bitrix?

Редирект для карточки товара работает, но редирект для разделов и подразделов перенаправляет на одну и ту же страницу, не могу понять в чем проблема....

На сайте необходимо сменить ЧПУ для каталога.
Раньше был настроен #SECTION_CODE_PATH#/#ELEMENT_CODE#/
который изменяется на #SECTION_CODE#/#ELEMENT_CODE#/.
Пробовал делать как описано здесь
1. В параметр SEF_URL_TEMPLATES добавил строку
"redirect" => "#SECTION_CODE_PATH#/#ELEMENT_CODE#/",
2. В своем шаблоне комплексного компонента catalog создал файл redirect.php (там где файлы типа section.php, element.php и т.д.)
3. В этом файле написал:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();?>
<?$this->setFrameMode(true);?>
<?
    use Bitrix\Main\Loader;
    use Bitrix\Main\ModuleManager;
    Loader::includeModule("iblock");
    Loader::includeModule("highloadblock");
    global $OptimusSectionID;
    $arElement = array();
    if($arResult["VARIABLES"]["ELEMENT_ID"] > 0){
            $arElement = COptimusCache::CIBLockElement_GetList(array('CACHE' => array("MULTI" =>"N", "TAG" => COptimusCache::GetIBlockCacheTag($arParams["IBLOCK_ID"]))), array("IBLOCK_ID" => $arParams["IBLOCK_ID"], "ACTIVE"=>"Y", "ID" => $arResult["VARIABLES"]["ELEMENT_ID"]), false, false, array("ID", "IBLOCK_ID", "IBLOCK_SECTION_ID", "DETAIL_PAGE_URL", "NAME"));
    }
    elseif(strlen(trim($arResult["VARIABLES"]["ELEMENT_CODE"])) > 0){
            $arElement = COptimusCache::CIBLockElement_GetList(array('CACHE' => array("MULTI" =>"N", "TAG" => COptimusCache::GetIBlockCacheTag($arParams["IBLOCK_ID"]))), array("IBLOCK_ID" => $arParams["IBLOCK_ID"], "ACTIVE"=>"Y", "=CODE" => $arResult["VARIABLES"]["ELEMENT_CODE"]), false, false, array("ID", "IBLOCK_ID", "IBLOCK_SECTION_ID", "DETAIL_PAGE_URL", "NAME"));
    }
    //$OptimusSectionID = $arSection["ID"];
    
    if($arElement['DETAIL_PAGE_URL']) {
        LocalRedirect($arElement['DETAIL_PAGE_URL']);
      }

global $OptimusSectionID;
    $arSection = array();
    if($arResult["VARIABLES"]["SECTION_ID"] > 0){
            $arSection = COptimusCache::CIBlockSection_GetList(array('CACHE' => array("MULTI" =>"N", "TAG" => COptimusCache::GetIBlockCacheTag($arParams["IBLOCK_ID"]))), array('GLOBAL_ACTIVE' => 'Y', "ID" => $arResult["VARIABLES"]["SECTION_ID"], "IBLOCK_ID" => $arParams["IBLOCK_ID"]), false, array("ID", "IBLOCK_ID", "UF_TIZERS", "IBLOCK_TYPE_ID", "IBLOCK_SECTION_ID", "CODE", "SECTION_ID", "SECTION_PAGE_URL", "NAME"));
    }
    elseif(strlen(trim($arResult["VARIABLES"]["SECTION_CODE"])) > 0){
            $arSection = COptimusCache::CIBlockSection_GetList(array('CACHE' => array("MULTI" =>"N", "TAG" => COptimusCache::GetIBlockCacheTag($arParams["IBLOCK_ID"]))), array('GLOBAL_ACTIVE' => 'Y', "=CODE" => $arResult["VARIABLES"]["SECTION_CODE"], "IBLOCK_ID" => $arParams["IBLOCK_ID"]), false, array("ID", "IBLOCK_ID", "UF_TIZERS", "IBLOCK_TYPE_ID", "IBLOCK_SECTION_ID", "CODE", "SECTION_ID", "SECTION_PAGE_URL", "NAME"));
    }
        $OptimusSectionID = $arSection["ID"];

            if(strpos($arSection['SECTION_PAGE_URL'], '#SECTION_CODE_PATH#') !== true) {
                $elementId = $arResult['VARIABLES']['SECTION_ID'];
                    $filter = ['IBLOCK_ID' => $arParams['IBLOCK_ID'], 'ID' => $elementId];
                        $element = [];
                            $iterator = CIBlockSection::GetList([], $filter, false, false, ["IBLOCK_ID", "ID", "SECTION_PAGE_URL", "IBLOCK_TYPE_ID", "IBLOCK_SECTION_ID", "CODE", "SECTION_ID", "NAME"]);

                            if($row = $iterator->GetNext()) {
                                $element = $row;
                            }
        if($element['SECTION_PAGE_URL']) {
            LocalRedirect($element['SECTION_PAGE_URL']);
        }
    }
?>
  • Вопрос задан
  • 903 просмотра
Решения вопроса 1
@PetrPo
здесь ответ, если нужен редирект только для элементов

Если нужен и для разделов, как в вопросе ТС, можно добавить проверку
$variables['SECTION_CODE_PATH'] = $arResult['VARIABLES']['SECTION_CODE_PATH'].'/'.$arResult['VARIABLES']['ELEMENT_CODE'];
CIBlockFindTools::checkSection($arParams['IBLOCK_ID'], $variables);

if(isset($variables['SECTION_ID']) && $variables['SECTION_ID']) {
  // здесь для разделов редирект
}
else {
  // здесь для элементов
}

Остальное в комментариях
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Asokr
Спасибо PetrPo.
Оставлю тут готовый, рабочий код из диалога выше. Происходит редирект разделов и элементов.
В моем случае, еще были нижние подчеркивания у старых URL, у новых тире...+ 301 редирект, вместо 302...
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$this->setFrameMode(true);

$variables['SECTION_CODE_PATH'] = $arResult['VARIABLES']['SECTION_CODE_PATH'].'/'.$arResult['VARIABLES']['ELEMENT_ID'];
$variables['SECTION_CODE_PATH'] = str_replace('_', '-', $variables['SECTION_CODE_PATH']);

CIBlockFindTools::checkSection($arParams['IBLOCK_ID'], $variables);

if(isset($variables['SECTION_ID']) && $variables['SECTION_ID']) {
  $iblock = \Bitrix\Iblock\IblockTable::getList([
    'select' => ['SECTION_PAGE_URL'],
    'filter' => ['ID' => $arParams['IBLOCK_ID']],
    'cache' => ['ttl' => 31536000]
  ])->fetch();

  if(strpos($iblock['SECTION_PAGE_URL'], '#SECTION_CODE_PATH#') !== false) {
    $sectionId = $variables['SECTION_ID'];

    $filter = ['IBLOCK_ID' => $arParams['IBLOCK_ID'], 'ID' => $sectionId];


    $obCache = new CPHPCache();
    if($obCache->InitCache(36000, serialize($filter), '/iblock/catalog/redirect')) {
      $section = $obCache->GetVars();
    }
    elseif($obCache->StartDataCache()) {
      $section = [];

      $iterator = CIBLockSection::GetList([], $filter, false, ["IBLOCK_ID", "ID", "SECTION_PAGE_URL", "IBLOCK_TYPE_ID", "IBLOCK_SECTION_ID", "CODE", "SECTION_ID", "NAME"]);

      if(defined("BX_COMP_MANAGED_CACHE")) {
        global $CACHE_MANAGER;
        $CACHE_MANAGER->StartTagCache('/iblock/catalog/redirect');

        if($row = $iterator->GetNext()) {
          $section = $row;
          $CACHE_MANAGER->RegisterTag('iblock_id_'.$arParams['IBLOCK_ID']);
        }

        $CACHE_MANAGER->EndTagCache();
      }
      else {
        if($row = $iterator->GetNext()) {
          $section = $row;
        }
      }

      $obCache->EndDataCache($section);
    }
    if($section['SECTION_PAGE_URL']) { 
      LocalRedirect($section['SECTION_PAGE_URL'], false, '301 Moved permanently');
    }
  }
} else {
  $iblock = \Bitrix\Iblock\IblockTable::getList([
    'select' => ['DETAIL_PAGE_URL'],
    'filter' => ['ID' => $arParams['IBLOCK_ID']],
    'cache' => ['ttl' => 31536000]
  ])->fetch();

  if(strpos($iblock['DETAIL_PAGE_URL'], '#ELEMENT_CODE#') !== false) {
    $elementId = $arResult['VARIABLES']['ELEMENT_ID'];
    $filter = ['IBLOCK_ID' => $arParams['IBLOCK_ID'], 'ID' => $elementId];
    
    $obCache = new CPHPCache();
    if($obCache->InitCache(36000, serialize($filter), '/iblock/catalog/redirect')) {
      $element = $obCache->GetVars();
    }
    elseif($obCache->StartDataCache()) {
      $element = [];

      $iterator = CIBLockElement::GetList([], $filter, false, false, ['IBLOCK_ID', 'ID', 'DETAIL_PAGE_URL']);
      
      if(defined("BX_COMP_MANAGED_CACHE")) {
        global $CACHE_MANAGER;
        $CACHE_MANAGER->StartTagCache('/iblock/catalog/redirect');

        if($row = $iterator->GetNext()) {
          $element = $row;
          $CACHE_MANAGER->RegisterTag('iblock_id_'.$arParams['IBLOCK_ID']);
        }

        $CACHE_MANAGER->EndTagCache();
      }
      else {
        if($row = $iterator->GetNext()) {
          $element = $row;
        }
      }
        
        
      $obCache->EndDataCache($element);
    }


    if($element['DETAIL_PAGE_URL']) {
      LocalRedirect($element['DETAIL_PAGE_URL'], false, '301 Moved permanently');
    }
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы