Привіт. Для успішної роботи пошукових машин з сайтом в якості 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”]) “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: Як замінити символи примусово, не чекаючи виклику обробника події?
Нещодавно було потрібно виконати таку операцію з вже існуючим набором елементів і розділів инфоблока. Для цього довелося написати невеликий скрипт, який запитував всі розділи та елементи інформаційних блоків певного типу, і замінював символи при знаходженні символу нижнього підкреслення на символ мінус. Нижче наводжу код, зверніть увагу, що викликати цей скрипт потрібно залогувавшись у під обліковим записом користувача з правами адміністратора.

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
?>

Заміна символів у символьних кодів

0){
foreach($arResult[‘MSG’] as $msgValue){?>

Додав: htmaker, 09.03.2014 р.
(2 голосів, середній: 3,00 з 5)

Завантаження…

Діліться з друзями:

См. також:


Налаштування часу у VMBitrix
Рубрика: Bitrix, Linux

Видалення «кинутих» кошиків в системі Бітрікс
Рубрика: Bitrix

Використання highload-блоків в Bitrix
Рубрика: Bitrix

Як виконати SQL запит в Bitrix
Рубрика: Bitrix

Як підрахувати кількість елементів в Bitrix?
Рубрика: Bitrix

Динамічне масштабування зображень в Bitrix
Рубрика: Bitrix

Виключаємо користувача з ID=1 групи адміністраторів в Bitrix
Рубрика: Bitrix

Як скинути пароль адміністратора у Bitrix?
Рубрика: Bitrix

SQL-запити в бітрікс
Рубрика: Bitrix

Коментарі

  • Олексій пише:
    29.05.2015 у 08:05

    У тебе помилка!

    if(strripos($code, ‘_’)){ — так працювати правильно не буде, так як “-1” при “==” — це не false

    потрібно замінити на:
    if(strripos($code, ‘_’)!==false){

    Відповісти

  • htmaker пише:
    30.05.2015 у 17:27

    виправив, дякую)

    Відповісти

  • Костянтин пише:
    26.08.2015 в 14:49

    Доброго дня! Зіткнувся з такою ж необхідністю. Думаю ваша стаття допоможе вирішити половину проблеми — замінити адреси у елементів інфоблоків. Однак залишиться інша половина проблеми: чи можна якось організувати редирект зі сторінок, що містять символ нижнього підкреслення на аналогічні сторінки, що містять тире? Справа в тому, що сайт робочий і багато сторінок в індексі. Заздалегідь спасибі!

    Відповісти

  • htmaker пише:
    26.08.2015 у 22:10

    У компоненті відповідає за показ елемента замінюйте символ _ на — у коді запиту, (функція str_replace), потім 301 редирект за новою адресою з допомогою функції LocalRedirect в битриксе. Думаю такий милицю згодиться поки в пошуковику не оновляться URL-адреси на нові.

    Відповісти

  • htmaker пише:
    26.08.2015 в 22:21

    Забув, а перед цим ще добре б перевіряти наявність таких символів в коді запиту, щоб не робити редиректа в холосту, можна за допомогою функції strpos

    Відповісти

  • Костянтин пише:
    28.08.2015 в 14:27

    Якщо кому цікаво — вирішив проблему тригером у /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’);
    }
    }

    Відповісти

  • Сергій пише:
    07.10.2015 в 17:26

    На працює у мене так=( Можна це реалізувати через .htaccess?

    Відповісти

  • Іван пише:
    27.01.2016 в 14:39

    Добрий день, а можна таким же способом вирішити мою проблему? У мене після вивантаження з 1С назва елементів українською мовою а у властивості цього елемента є російське найменування і його потрібно поставити в назву. Витягнути властивість в каталог не становить праці, але потрібно зробити повну заміну скрізь, як в результатах пошуку, так і при надсиланні шаблону. Підкажіть будь ласка.

    Відповісти