Привет. Для успешной работы поисковых машин с сайтом в качестве URL доступа к страницам рекомендуется использовать ЧПУ. ЧПУ – человеко-понятные URL, удобные URL-адреса для восприятия человеком. На самом деле, сегодня это делается для поисковых машин, тем самым оптимизируя страницы для лучшей индексации сайта.
Сайты, работающие под управлением 1С-Битрикс, в основном хранят свои данные в инфоблоках. При выводе содержимого элемента, это могут быть новости, обзоры, карточка товара и т.д., компонент может генерировать человеко-понятные URL, если в настройках включен режим ЧПУ. Большая часть символьных кодов элементов и разделов генерируется динамически, путем транслитерации из названия разделов и элементов инфоблока. По умолчанию знаки пробелов заменяются нижним подчеркиванием. Однако бытует мнение, что в ЧПУ лучше всего использовать символы из ограниченного набора ASCII-символов. В частности, вместо пробела лучше использовать символы минус «-» или подчеркиванием «_». Рассмотрим пример, как можно изменить разделительные символы нижнего подчеркивания «_» на символ минус «-», при генерации элемента.
Проще всего это сделать посредством файла init.php – создать обработчик события, при добавлении и обновлении элемента.
Код:
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", 'slugTranslit');
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", 'slugTranslit');
Функция:
function slugTranslit(&$arFields){
# Если заполнено имя и не заполнен символьный код
if (strlen($arFields["NAME"]) > 0 && strlen($arFields["CODE"]) <= 0){
$arParams = array(
"max_len" => "100", # обрезаем символьный код до 100 символов
"change_case" => "L", # приводим к нижнему регистру
"replace_space" => "-", # меняем пробелы на тире
"replace_other" => "-", # меняем плохие символы на тире
"delete_repeat_replace" => "true", # удаляем повторяющиеся тире
"use_google" => "false", # отключаем использование google
);
$arFields["CODE"] = Cutil::translit($arFields["NAME"], "ru", $arParams);
}
}
Попробуйте создать либо открыть на редактирование элемент, после, сохраните изменения, затем проверьте его символьный код. Если разделяющие символы задались в виде знака минус «-», значит всё в порядке.
UPD: Как заменить символы принудительно, не ожидая вызова обработчика события?
Недавно потребовалось проделать такую операцию с уже существующим набором элементов и разделов инфоблока. Для этого пришлось написать небольшой скрипт, который запрашивал все разделы и элементы информационных блоков определенного типа, и заменял символы при нахождении символа нижнего подчеркивания на символ минус. Ниже привожу код, обратите внимание, что вызывать этот скрипт нужно залогинившись под учетной записью с правами администратора.
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
define("NEED_AUTH", true);
global $USER;
if (!$USER->IsAdmin()) LocalRedirect("/");
set_time_limit(600);
$IBLOCK_TYPE = 'catalog';
# функция для замены символа "_" на "-"
function repSymCode($code){
if(strripos($code, '_')!==false){
$code = str_replace('_','-',$code);
if(substr($code, -1) == '-')
$code = substr($code,0,(strlen($code) - 1));
return $code;
} else return false;
}
# кнопка старт
if (isset($_REQUEST['start']) && CModule::IncludeModule("iblock")){
#------------------------------
# Обновление кодов секций
#------------------------------
$sectionRes = CIBlockSection::GetList(
array("SORT"=>"ASC"),
array('IBLOCK_TYPE' => $IBLOCK_TYPE),
false,
array('CODE','ID'),
false
);
$siCnt=0;
$secObj = new CIBlockSection;
while($arSection = $sectionRes->GetNext()){
$code = repSymCode($arSection['CODE']);
if ($code != false){
$siCnt++;
$secObj->Update($arSection['ID'], array('CODE' => $code));
}
}
$arResult['MSG'][] = 'Обновлено разделов: '.$siCnt;
#-------------------------------
#-----------------------------
# Обновление кодов элементов
#-----------------------------
$elemRes = CIBlockElement::GetList(
array("SORT"=>"ASC"),
array('IBLOCK_TYPE' => $IBLOCK_TYPE),
false,
false,
array('ID','CODE')
);
$elObj = new CIBlockElement;
$eiCnt = 0;
while($arElemObj = $elemRes->GetNextElement()){
$arElemFields = $arElemObj->GetFields();
$code = repSymCode($arElemFields['CODE']);
if ($code != false){
$elObj->Update($arElemFields['ID'], array('CODE' => $code));
$eiCnt++;
}
}
$arResult['MSG'][] = 'Обновлено элементов: '.$siCnt;
#----------------------------------------------------
} # end if
?>
<h2>Замена символов в символьных кодах</h2>
<?if (count($arResult['MSG'])>0){
foreach($arResult['MSG'] as $msgValue){?><p><?=$msgValue?></p><?}
}?>
<form method="post"><input type="submit" name="start" value="Старт"></form>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
У тебя ошибка!
if(strripos($code, '_')){ - так работать правильно не будет, так как "-1" при "==" - это не false
нужно заменить на:
if(strripos($code, '_')!==false){
поправил, спасибо)
Здравствуйте! Столкнулся с такой же необходимостью. Думаю ваша статья поможет решить половину проблемы - заменить адреса у элементов инфоблоков. Однако останется другая половина проблемы - можно ли как то организовать редирект со страниц, содержащих символ нижнего подчеркивания на аналогичные страницы, содержащие тире? Дело в том, что сайт рабочий и много страниц уже есть в индексе. Заранее спасибо!
В компоненте отвечающий за показ элемента заменяйте символ _ на - в коде запроса, (функция str_replace), затем 301 редирект по новому адресу с помощью функции LocalRedirect в битриксе. Думаю такой костылек сгодится пока в поисковике не обновятся URL-адреса на новые.
Забыл, а перед этим ещё хорошо бы проверять наличие таких символов в коде запроса, чтобы не делать редиректа в холостую, можно с помощью функции strpos
Если кому интересно - решил проблему триггером в /bitrix/php_interface/init.php
AddEventHandler("main", "OnEpilog", "myUrlCheck");
function myUrlCheck()
{
GLOBAL $APPLICATION;
$myCurUrl = $APPLICATION->GetCurPageParam();
if (strpos($myCurUrl, '_'))
{
$myNewUrl = str_replace('_', '-', $myCurUrl);
LocalRedirect($myNewUrl, 0, '301 Moved permanently');
}
}
На работает у меня так=( Можно ли это реализовать через .htaccess?
Добрый день, а можно ли таким же способом решить мою проблему? У меня после выгрузки из 1С название элементов на украинском языке а в свойстве этого элемента есть русское наименование и его нужно поставить в название. Вытащить свойство в каталог не составляет труда, но нужно сделать полную замену везде, как в результатах поиска так и при отправке почтового шаблона. Подскажите пожалуйста.