Избавление от дублей страниц
Joomla 1.6+ (эти файлы почти всегда переопределены в шаблоне, так что ищите в папке HTML шаблона)
Скрыть текстовый блок
Для статьи
Файл components\com_content\views\article\tmpl\default.php
Код
<?php
if ($this->item->readmore_link != JRequest::getURI())
JApplication::redirect ($this->item->readmore_link,'','' ,true);
?>
Для категории
Файл components\com_content\views\category\tmpl\blog.php
Код
<?php
$this->original_link = JRoute::_(ContentHelperRoute::getCategoryRoute(JRequest::getVar('id'),
0));
if (JRequest::getInt('start') > 0) $this->original_link .= "?start=" . JRequest::getVar('start');
$this->real_link = JRequest::getURI();
if ($this->original_link != $this->real_link) JApplication::redirect($this->original_link,'','' ,true);
?>
Для главной
файл components\com_content\views\featured\tmpl\default.php
Код
<?php
$this->original_link = "/";
if (JRequest::getInt('start') > 0) $this->original_link .= "index.php?start=" .
JRequest::getVar('start');
$this->real_link = JRequest::getURI();
if ($this->original_link != $this->real_link) JApplication::redirect($this->original_link,'','' ,true);
?>
Уборка левой страницы вылазящей при открытии url с алиасом псевдонима пункта меню.
надо добавить в файл \html\com_content\categories\default.php следующий код
// редирект с url ссылочного пункта меню
$app = JFactory::getApplication();
$menu = $app->getMenu()->getActive();
if ($menu->type=='alias')
{
$url = JURI::root().$menu->link.$menu->params->get('aliasoptions');
$app->redirect(JRoute::_($url),'','' ,true);
}
Для VirtueMart 1,1 (может и на других заработает, не проверял)
Скрыть текстовый блок
Для страницы товара (Вписывать во flypage, который используется, шаблона который используется. )
Файл (примерный путь) components\com_virtuemart\themes\default\templates\product_details\flypageX.php
Код
<?php
$productlink = $sess->url( URL."index.php?page=shop.product_details&flypage=flypage.tpl&product_id=".$product_id."&category_id=".$category_id."&option=com_virtuemart");
if (JRoute::_($productlink)!= JRequest::getURI()) JApplication::redirect(JRoute::_($productlink),'','' ,true);
?>
P.S. Если создан пункт меню на магазин (именно на магазин, а не на категорию), то нужно к ссылке по-умолчанию добавить ID этого пункта меню. В итоге будет так
Код
<?php
$productlink = $sess->url( URL."index.php?page=shop.product_details&flypage=flypage.tpl&product_id=".$product_id."&category_id=".$category_id."&option=com_virtuemart&itemid=2");
if (JRoute::_($productlink)!= JRequest::getURI()) JApplication::redirect(JRoute::_($productlink),'','' ,true);
?>
Где 2, это ID пункта меню, который ссылается на магазин.
Если пункты меню созданы и на категории, то скорее всего работать будет не так как нужно.
Для категории (ссылка получится немного не такая, но зато одна единственная)
Файл (примерный путь) \components\com_virtuemart\themes\default\templates\browse\includes\browse_header_category.tpl.php
Код
<?php
$this->original_link = $sess->url( URL."index.php?page=shop.browse&category_id=".$category_id."&option=com_virtuemart");
if (JRequest::getInt('start') > 0) $this->original_link .= "?start=" .
JRequest::getVar('start');
$this->real_link = JRequest::getURI();
if ($this->original_link != $this->real_link) JApplication::redirect($this->original_link,'','' ,true);
?>
Для FLEXIcontent 2.0
Скрыть текстовый блок
Для полного материала
файл components\com_flexicontent\templates\default\item.php (Где default - используемый шаблон материала)
Код
<?php
if (JRoute::_(FlexicontentHelperRoute::getItemRoute($this->item->slug, $this->item->categoryslug))!= JRequest::getURI()) JApplication::redirect(JRoute::_(FlexicontentHelperRoute::getItemRoute($this->item->slug, $this->item->categoryslug)),'','' ,true);
?>
Для K2
Скрыть текстовый блок
Для полного материала:
файл components/com_k2/templates/default/item.php (Где default - используемый шаблон материала)
Код
<?php
if ($this->item->link!= JRequest::getURI()) JApplication::redirect($this->item->link,'','' ,true);
?>
Для категории
components/com_k2/templates/default/category_item.php
Код
<?php
$this->original_link = JRoute::_(K2HelperRoute::getCategoryRoute(JRequest::getVar('id'),
0));
if (JRequest::getInt('start') > 0) $this->original_link .= "?start=" . JRequest::getVar('start');
$this->real_link = JRequest::getURI();
if ($this->original_link != $this->real_link) JApplication::redirect($this->original_link,'','' ,true);
?>
Для zoo. (Проверял на 2.6.6)
Скрыть текстовый блок
В нём хоть и присваивается rel="canonical", но меня не устроило, когда материал принадлежит нескольким категориям, то он имеет отдельную ссылку в каждой категории. Да и вообще склейку больше уважаю.
Для полного материала
/media/zoo/applications/blog/templates/default/item.php (Править нужно шаблон тот, который вы используете. blog и default для примера)
Код
<?php if (JRoute::_($this->app->route->item($this->item, false))!= JRequest::getURI())
JApplication::redirect (JRoute::_($this->app->route->item($this->item, false)),'','' ,true); ?>
Для JoomShopping (Пробовал на версии 3.11.4)
Скрыть текстовый блок
Если созданы пункты меню на категории, то что-то непонятное... То ли работает, то ли нет Azn Или я структуру не так настраиваю. Почти не работал с ЖШ. Тестируем, отписываемся.
Страница товара
Файл components\com_jshopping\templates\default\product\product_default.php (Ну или в Вашем шаблоне)
Код
<?php
$productlink = 'index.php?option=com_jshopping&controller=product&task=view&category_id='.$this->category_id.'&product_id='.$this->product->product_id;
if (JRoute::_($productlink)!= JRequest::getURI()) JApplication::redirect(JRoute::_($productlink),'','' ,true);
?>
Стоит отметить, что при использовании редиректа станет невозможной передача параметров через URL. В часности не работает страница печати.
Аналогичным образом можна избавиться от дублей остальных компонентов. Коллекция будет пополняться. Не пропустите Azn
Добавлено: хак для роутера com_content проверялся на версии 2.5.4 и 2.5.7
Избавляет от дублей вида - site.ru/2 site.ru/333 и подобных (страницы нормально отдают 404)
/components/com_content/router.php
просто закомментировать строку
Код
$vars['id'] = (int)$segments[0];