После установки в Joomla компонента K2, который является мощнейшим конструктором контента (CCK), в ссылках на материалы появляются item и id.
Возможно для кого-то это покажется не критичным, но для многих это раздражающий фактор в борьбе за "красивые ссылки".
В данном случае я не исключение, поэтому поспешил избавиться от этих ненужных "вставок" в ссылки.
Рассматривается тот случай, когда у нас используются штатные средства SEO. В предыдущей статье я уже описывал как включить ЧПУ и как избавиться от index.php в ссылках. Учитывая этот опыт, ссылки должны выглядеть следующим образом
Для того, чтобы почистить ссылки нужно будет найти файл router.php в файловой структуре компонента K2.
"корневая папка вашего сайта"/components/com_k2/router.php
Нужно заменить содержимое этого файла на приведённый ниже код
Нажмите для просмотра кодаКод файла router.php
<?php
// no direct access
defined('_JEXEC') or die('Restricted access');
//SELECT alias FROM `j25_k2_items` WHERE id = "1" LIMIT 1
//SELECT id FROM `j25_k2_items` WHERE alias = "test" LIMIT 1
function K2BuildRoute( & $query) {
$segments = array ();
$menu = & JSite::getMenu();
if ( empty($query['Itemid'])) {
$menuItem = & $menu->getActive();
}
else {
$menuItem = & $menu->getItem($query['Itemid']);
}
$mView = ( empty($menuItem->query['view']))?null:$menuItem->query['view'];
$mTask = ( empty($menuItem->query['task']))?null:$menuItem->query['task'];
$mId = ( empty($menuItem->query['id']))?null:$menuItem->query['id'];
$mTag = ( empty($menuItem->query['tag']))?null:$menuItem->query['tag'];
if ( isset ($query['layout'])) {
unset ($query['layout']);
}
if ( $mView == @$query['view'] && $mTask == @$query['task'] && $mId == @intval($query['id']) && @intval($query['id']) > 0 ) {
unset ($query['view']);
unset ($query['task']);
unset ($query['id']);
}
if ( $mView == @$query['view'] && $mTask == @$query['task'] && $mTag == @$query['tag'] && isset($query['tag']) ) {
unset ($query['view']);
unset ($query['task']);
unset ($query['tag']);
}
if ( isset ($query['view'])) {
$view = $query['view'];
$segments[] = $view;
unset ($query['view']);
}
if (@ isset ($query['task'])) {
$task = $query['task'];
$segments[] = $task;
unset ($query['task']);
}
if ( isset ($query['id'])) {
$id = $query['id'];
$segments[] = $id;
unset ($query['id']);
}
if ( isset ($query['cid'])) {
$cid = $query['cid'];
$segments[] = $cid;
unset ($query['cid']);
}
if ( isset ($query['tag'])) {
$tag = $query['tag'];
$segments[] = $tag;
unset ($query['tag']);
}
if ( isset ($query['year'])) {
$year = $query['year'];
$segments[] = $year;
unset ($query['year']);
}
if ( isset ($query['month'])) {
$month = $query['month'];
$segments[] = $month;
unset ($query['month']);
}
if ( isset ($query['day'])) {
$day = $query['day'];
$segments[] = $day;
unset ($query['day']);
}
if ( isset ($query['task'])) {
$task = $query['task'];
$segments[] = $task;
unset ($query['task']);
}
// Изменения.
if(isset($segments[0]))
{
if($segments[0]=='item')
{
$alias = explode(':',$segments[1]);
$segments[0]=null;
$segments[1]=$alias[1];
}
}
// Изменения. Конец.
return $segments;
}
function K2ParseRoute($segments) {
$vars = array ();
// Изменения.
$id = false;
if(count($segments)==1)
{
$alias = $segments[0];
$alias = str_replace ( ':' , '-' , $alias);
$db = &JFactory::getDBO();
$query = 'SELECT id FROM `#__k2_items` WHERE alias = "'.$alias.'" LIMIT 1';
$db->setQuery($query);
$id = $db->loadResult();
}
if($id)
{
$vars['view'] = 'item';
$vars['task'] = $id.':'.$alias;
$vars['id'] = $vars['task'];
}else{
// Изменения. Конец.
$vars['view'] = $segments[0];
if (!isset($segments[1]))
$segments[1]='';
$vars['task'] = $segments[1];
if ($segments[0] == 'itemlist') {
switch($segments[1]) {
case 'category':
$vars['id'] = $segments[2];
break;
case 'tag':
if (isset($segments[2]))
$vars['tag'] = $segments[2];
break;
case 'user':
if (isset($segments[2]))
$vars['id'] = $segments[2];
break;
case 'date':
if (isset($segments[2]))
$vars['year'] = $segments[2];
if (isset($segments[3]))
$vars['month'] = $segments[3];
if (isset($segments[4])) {
$vars['day'] = $segments[4];
}
break;
}
}
else if ($segments[0] == 'item') {
switch($segments[1]) {
case 'edit':
if (isset($segments[2]))
$vars['cid'] = $segments[2];
break;
case 'download':
if (isset($segments[2]))
$vars['id'] = $segments[2];
break;
default:
$vars['id'] = $segments[1];
break;
}
}
if($segments[0] == 'comments' && isset($segments[1]) && $segments[1] == 'reportSpammer') {
$vars['id'] = $segments[2];
}
//Изменения.
}
return $vars;
}
После замены кода ссылки станут более аккуратными.
Это наиболее часто встречаемый способ на просторах Internet.
Однако, разработчиками K2 предусмотрен более простой способ, который заключается в установке пары галочек в настройках компонента
Заходим в настройки K2 и во вкладке "Расширенные" устанавливаем два значения, как показано на рисунке ниже
Проверено на версии K2 2.6.8 и не надо лезть в код!