Уменьшение вложенности товаров
Актуально для версии 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