Уменьшение вложенности товаров — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
м (internal link)
 
Строка 1: Строка 1:
 +
'''Статья предоставлена партнером UMI.CMS [https://www.umi-cms.ru/find_webdevs/shiriev_artur_venerovich/ Шириевым Артуром]'''
 +
 
'''Актуально для версии 18.'''
 
'''Актуально для версии 18.'''
  
Часто для улучшения ранжирования в поисковых системах нужно уменьшать вложенность страниц. Например переместить товары на второй уровень, при этом сохранив структуру каталога.
+
Часто для улучшения ранжирования в поисковых системах нужно уменьшать вложенность страниц. Например, переместить товары на второй уровень, при этом сохранив структуру каталога.
  
 
Изначально для данной задачи использовал [http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/formirovanie_dannyh_na_servere_protokol_umap/ протокол Umap], но решение было не очень гибкое.
 
Изначально для данной задачи использовал [http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/formirovanie_dannyh_na_servere_protokol_umap/ протокол Umap], но решение было не очень гибкое.

Текущая версия на 16:26, 29 июня 2018

Статья предоставлена партнером 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