K2 дубли категорий

Четверг, 13 Август 2015

 

Задача: joomla создает кучу дублей адресов одной и тойже страницы. Это относится к категориям продукции. Привожу пример для одной из категорий, но данное будет действительно и для любой другой.

 

Правильный адрес:
http://site.com/ru/production/hands/kaski/
Дубли:
http://site.com/ru/production/clothes/kaski/
http://site.com/ru/production/footwear/kaski/
http://site.com/ru/production/59-kaski/
Надо как-то решить проблему с возникновением дублей.

 

Логика решения:

 

Проверяем если у просматриваемой категории, есть алиас и parent > 0, то получаем родительскую категорию, а также получаем параметры текущего меню. Проверяем что это категория не самого верхнего уровня (!=0), для нее нет смысла вредиректе т.к дублей на нее нет. Сравниваем ID родительской категории с параметром $menuItem->params->get('categories'), текущего меню.

 

Если они не равны, то ищем в БД в таблице #__menu по LIKE в поле `link`, тот пункт меню у которого будет указан ID родительской категории, для просматриваемой. Выбираем `alias`, `path`, проверяем что бы alias не был равен production, т.к это категория верхнего уровня, и далее редиректим на правильный урл, составляя его из полуенного alias пункта меню, и alias текущей категории.

 

Код плагина:

 

 
// Load the K2 Plugin API
JLoader::register('K2Plugin', JPATH_ADMINISTRATOR.DS.'components'.DS.'com_k2'.DS.'lib'.DS.'k2plugin.php');
class plgK2K2_redirect extends K2Plugin
{
 
 
  function plgK2K2_redirect($params) {
    parent::__construct($params);
  }
 
  function onK2CategoryDisplay(&$category, &$params, $limitstart){
 
        if($category->parent && $category->alias){
            $db = JFactory::getDBO();
            $query = "SELECT * FROM #__k2_categories WHERE `id` = ".$category->parent."";
            $db->setQuery($query);
            if(!$db->query()){echo $db->stderr(); return false;} 
            $result = $db->loadAssoc();
 
            $app = JFactory::getApplication();
            $menuItem = $app->getMenu()->getActive();
            $categories = $menuItem->params->get('categories');
 
            $urlBase = substr($_SERVER['REQUEST_URI'], 1, 14);
 
 
            if($result['parent']){
 
                if($categories[0] != $result['parent']){
 
                    $query = 'SELECT `alias`, `path` FROM #__menu WHERE `link` LIKE ' .
                        $db->quote('index.php?option=com_k2&view=itemlist&layout=category&task=category&id='.$result['parent']).'';
                    $db->setQuery($query);
                    if(!$db->query()){echo $db->stderr(); return false;} 
                    $_result = $db->loadAssoc();
 
                    //print_r($_result);
 
                    if(count($_result)){
                        if($_result['alias'] && $_result['alias']!='production'){
                            $app->redirect(JURI::root().$urlBase.$_result['alias'].'/'.$category->alias);
                        }
                    }
 
 
                }
            }
        }
  }
 
}
 

 

В переменной $urlBase настройте правильную обрезку для пути, конкретно для вашего случая, в моем случае сайт мультиязычный, поэтому дляна REQUEST_URI у меня может отличатся.

 

Скачать плагин plg_k2_redirect.zip для joomla 2.5

 

PS. Читайте последние записи RSS Подписка на RSS

 

Метки:

Добавить комментарий