Уменьшение вложенности товаров

Материал из Umicms
Версия от 16:26, 29 июня 2018; Kublan (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Статья предоставлена партнером UMI.CMS Шириевым Артуром

Актуально для версии 18.

Часто для улучшения ранжирования в поисковых системах нужно уменьшать вложенность страниц. Например, переместить товары на второй уровень, при этом сохранив структуру каталога.

Изначально для данной задачи использовал протокол Umap, но решение было не очень гибкое.

Недавно нашел более удачное решение, которое и привожу.

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

Перехват события (файл events.php в папке classes/modules/catalog в директории шаблона, или custom_events.php в системной папке модуля):

new umiEventListener('systemPrepare', 'catalog', 'short_links');

Права на доступ к макросу (permissions.php или permissions_custom.php):

$permissions = array(
    'view' => array('short_links')
);

Сама функция с комментариями:

// импортируем Service в самом начале файла
use UmiCms\Service;
//...
public function short_links(iUmiEventPoint $oEventPoint) {
    if ($oEventPoint->getMode() === "before") {
        // парсим url в массив
        $path_parts = Service::Request()->getPathParts();

        // у нас ссылки вида /product/{$alt-name}/
        // и соответственно здесь проверяется, соответствует ли ссылка данному шаблону
        @list($part1, $alt_name, $part3) = $path_parts;
        if ($part3 or $part1 !== 'product' or !$alt_name)
            return true;

        // ищем объект каталога по alt-name
        $pages = new selector('pages');
        $pages->types('hierarchy-type')->name('catalog', 'object');
        $pages->option('return')->value('id');
        $pages->where('alt_name')->equals($alt_name);
        $page_id = $pages->first();
        $page_id = $page_id ? @$page_id['id'] : false;
        if (!$page_id)
            return true;

        // переопределяем данные, чтобы сгенерировалась нужная страница
        $cmsController = cmsController::getInstance();
        $cmsController->setCurrentElementId($page_id);
        $cmsController->setCurrentModule('catalog');
        $cmsController->setCurrentMethod('object');
    }
    return true;
}

Для корректной работы нужно еще избавиться от товаров с одинаковым alt-name. Об этом с статье Поиск товаров с одинаковым alt-name