Универсальная ЧПУ пагинация для 1С-Битрикс

Часто СЕО-специалисты требуют от разработчиков ЧПУ ссылки, так же это часто касается и пагинации. В 1С-Битрикс стандартно она выглядит вот таким образом /catalog/category/?PAGEN_1=2, естественно это не очень… Наша цель что бы это было вот так /catalog/category/page-2/. Разберем вариант с манипуляциями без плагинов. Данный способ сработает с пагинацией вида PAGEN_2, для других можно доработать по аналогии, тестировался на версии 1C-Битрикс 18.0.1.

Редактируем файл template.php компонента system.pagenavigation

Итак, в самый низ вставляем данный код, который будет заниматься заменой ссылок в шаблоне пагинации:

$pagination = ob_get_contents();
$pagination = preg_replace_callback('/href="([^"]+)"/is', function($matches) {
    $url = $matches[1];
    $newUrl = '';
    if ($arUrl = parse_url($url)) {
        $newUrl = isset($_SERVER['REAL_FILE_PATH'])&&strlen($_SERVER['REAL_FILE_PATH']) ? str_replace('//','',preg_replace('/page-(\d+)/i', '/',$_SERVER['SCRIPT_URL'])) : $_SERVER['SCRIPT_NAME'];
        $newUrl = str_replace(array('index.php', 'index.html'), '', $newUrl);
        parse_str(htmlspecialcharsback($arUrl['query']), $arQuery);
        foreach ($arQuery as $k => $v) {
            if (in_array($k, array('SECTION_CODE'))) {
                unset($arQuery[$k]);
            } elseif (substr($k, 0, 5)=='PAGEN') {
                $newUrl .= 'page-'.intval($v).'/';
                unset($arQuery[$k]);
            }
        }
        $buildQuery = http_build_query($arQuery, '', '&');
        if (strlen($buildQuery)) {
            $newUrl .= '?'.$buildQuery;
        }
    }
    return 'href="'.$newUrl.'"';
}, $pagination);
ob_end_clean();
echo $pagination; 

Редактируем файл .htaccess

Обратите внимание на то что путь к файлу pagen.php должен быть относительно корня сервера.

После:

RewriteEngine On

Добавляем:

php_value auto_prepend_file "/home/bitrix/www/bitrix/pagen.php"	
RewriteRule ^(.*)page-1(.)$ /$1 [R=301,L] 
RewriteRule ^(.*)/page-([\d]+)/ /$1/?PAGEN_2=$2 [L,QSA]

Создаем файл pagen.php

Наполняем его следующим содержимым, которое будет выполнять роль роутера и конвертировать вот такой адрес: /catalog/category/page-2/ в такой: /catalog/category/?PAGEN_1=2 для системы.

<?php
$_SERVER['REQUEST_URI'] = preg_replace('#(page-[\d]+/)#is', '', $_SERVER['REQUEST_URI']);
?>

Вот собственно и готова наша ЧПУ пагинация для 1C-Битрикс.

[Всего голосов: 3    Средний: 4.7/5]

Привет, дорогой гость!

Я веб-разработчик, а этот сайт - мой блог. Отвечу на Ваши вопросы в комментариях :) По поводу сотрудничества сюда