BLOG

Добавляем rel=”canonical” в шаблоны K2, J 1.7-2.5

Добавляем rel=”canonical” в шаблоны K2, J 1.7-2.5

Добавлен код генерации ссылки каноникал для главной страницы сайта.
Во все файлы шаблона, КРОМЕ com_k2/templates/default/itemform.php, добавлено условие запрета генерации ссылки каноникал для главной страницы.
Это сделанно для избежания дублирования ссылки каноникал на главной странице и редиректа, если в качестве главной указывается определенный материал.

Что такое каноническая страница? Зачем нужно указывать rel="canonical"?

  • Каноническая страница представляет собой предпочитаемую версию из набора страниц с очень похожим содержанием. На сайтах часто бывает несколько страниц, перечисляющих один и тот же набор продуктов. В частности, на одной странице продукты могут быть указаны в алфавитном порядке, а на других – упорядочены по цене или рейтингу.
    Рассмотрим пример:

    ttp://www.example.com/product.php?item=swedish-fish&trackingid=1234567&sort=alpha&sessionid=5678asfasdfasfd
    http://www.example.com/product.php?item=swedish-fish&trackingid=1234567&sort=price&sessionid=5678asfasdfasfd

    Если Google будет знать о том, что содержание этих страниц одинаково, то сможет добавить в результаты поиска только одну из них. Наши алгоритмы выбирают ту страницу, которая, по нашему мнению, лучше всего отвечает на запрос пользователя. Тем не менее, теперь пользователи могут указывать поисковым системам каноническую страницу, добавив элемент с атрибутом rel="canonical" в раздел неканонической версии страницы. Добавление этой ссылки и атрибута позволяет владельцам сайтов определять наборы идентичного содержания и сообщать Google: "Из всех страниц с идентичным содержанием эта является наиболее полезной. Установите для нее наивысший приоритет в результатах поиска."

  • Атрибут rel="canonical" тега В том случае, если на сайте присутствуют группы схожих по контенту страниц, вебмастер может выбрать предпочитаемый (канонический) url от группы, который будет участвовать в поиске.
    Например, документ сайта доступен по двум url:
    www.examplesite.ru/pages?id=2
    www.examplesite.ru/blog
    
    Если предпочитаемый url — /blog, в документе, доступном по неканоническому url, достаточно указать:
    <link rel="canonical" href="http://www.examplesite.ru/blog"/>

Приступим к убийству страниц-дублей.

  1. Не используйте ссылку тега base в качестве canonical! Это вредно.
  2. Читайте комментарии в коде.
  3. Нашли ошибку? Пишите, попробуем разобраться.

При обновлении заменяем весь код находящийся между строками

// ------------ Start Canonical-Mod
и
// ------------ End Canonical-Mod

Ссылка Canonical для главной страницы сайта

Открываем файл templates/МОЙ ШАБЛОН/index.php

после:

// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

добавляем:

// ------------ Start Canonical-Mod
$document = JFactory::getDocument();
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive() == $mainmenu->getDefault()) :
	$livesite = substr_replace(JURI::root(), '', -1, 1);
	$docpagenr = '';
	$docstart = JRequest::getInt('start',0);
	if($docstart>0) :
		// Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже.
		//$docpagenr = '?start='.$docstart;
	endif;
	//$docroute = JRoute::_('index.php?Itemid='.$mainmenu->getDefault()->id);
	// Если в качестве канонической ссылки хотим использовать системную ссылку Joomla типа http://мойсайт.рф/home.html , то раскомментируем сроку выше, и закомментируем строку ниже.
	$docroute = '/';
	$document->addHeadLink( $livesite . $docroute . $docpagenr, 'canonical', 'rel', '' );
endif;
// ------------ End Canonical-Mod

Открываем файл components/com_k2/templates/default/category.php

после:

// no direct access
defined('_JEXEC') or die('Restricted access');

добавляем:

// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
	$document = JFactory::getDocument();
	$livesite = substr_replace(JURI::root(), '', -1, 1);
	// Постраничная разбивка
	$docstart = JRequest::getInt('start',0);
	$docpagenr = '';
	if($docstart>0) {
		// Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница категории
		//$docpagenr = '?start=' . $docstart;
	}
	// Если это подкатегория
	if ($this->category->parent >0) :
		$docroute = JRoute::_(K2HelperRoute::getCategoryRoute($this->category->id.':'.$this->category->alias));
	// Если это основная категория
	else :
		$k2menulink = JSite::getMenu()->getParams($active->id);
		$docroute = JRoute::_($k2menulink->link . '&Itemid=' . $k2menulink->id);
	endif;
	$document->addHeadLink( $livesite . $docroute . $docpagenr, 'canonical', 'rel', '' );
endif;
// ------------ End Canonical-Mod

Открываем файл components/com_k2/templates/default/item.php

после

// no direct access
defined('_JEXEC') or die('Restricted access');

добавляем

// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
	$livesite = substr_replace(JURI::root(), '', -1, 1);
	$document = &JFactory::getDocument();
	$docroute = JRoute::_(K2HelperRoute::getItemRoute($this->item->id.':'.$this->item->alias, $this->item->catid.':'.$this->item->category->alias));
	// Начало проверки системной ссылки в запросе
	$requrl = trim(JFactory::getURI()->toString());
	(bool)$valideurl = strpos( $requrl, $docroute );
	// Если системная ссылка в запросе отсутствует
	if ($valideurl === false) :
		header("HTTP/1.1 301 Moved Permanently");
		header("Location: ".$livesite.$docroute);
		header("Connection: close");
		exit();
		// Если хотим отдать ошибку 404, то закомментируем 4 строки выше этой, и раскомментируем 1 сроку ниже.
		//JError::raiseError(404, JText::_('PAGE COULD NOT BE FOUND'));
	endif;
	// Конец проверки системной ссылки в запросе
	$document->addHeadLink( $livesite . $docroute, 'canonical', 'rel', '' );
endif;
// ------------ End Canonical-Mod

Открываем файл components/com_k2/templates/default/latest.php

после

// no direct access
defined('_JEXEC') or die('Restricted access');

добавляем

// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
	$document = JFactory::getDocument();
	$livesite = substr_replace(JURI::root(), '', -1, 1);
	// Если это подкатегория
	if ($this->category->parent >0) :
		$docroute = JRoute::_(K2HelperRoute::getCategoryRoute($category->id.':'.$category->alias));
	// Если это основная категория меню
	else :
		$k2menulink = JSite::getMenu()->getParams($active->id);
		$docroute = JRoute::_($k2menulink->link . '&Itemid=' . $k2menulink->id);
	endif;
	// Начало проверки системной ссылки в запросе
	$requrl = trim(JFactory::getURI()->toString());
	(bool)$valideurl = strpos( $requrl, $docroute );
	// Если системная ссылка в запросе отсутствует
	if ( $valideurl === false) :
		// отдаем ошибку 404
		JError::raiseError(404, JText::_('K2_CATEGORY_NOT_FOUND'));
	endif;
	// Конец проверки системной ссылки в запросе
	$document->addHeadLink( $livesite . $docroute, 'canonical', 'rel', '' );
endif;
// ------------ End Canonical-Mod

Открываем файл components/com_k2/templates/default/tag.php

после

// no direct access
defined('_JEXEC') or die('Restricted access');

добавляем

// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
	$document = JFactory::getDocument();
	$livesite = substr_replace(JURI::root(), '', -1, 1);
	$docroute = JRoute::_(K2HelperRoute::getTagRoute(JRequest::getVar('tag')));
	// Начало проверки системной ссылки в запросе
	$requrl = trim(JFactory::getURI()->toString());
	(bool)$valideurl = strpos( $requrl, $docroute );
	// Если системная ссылка в запросе отсутствует
	if ( $valideurl === false) :
		// отдаем ошибку 404
		JError::raiseError(404, JText::_('K2_NOT_FOUND'));
	endif;
	// Конец проверки системной ссылки в запросе
	// Если материал с заданным тегом/меткой не найден, то указываем поисковикам чтобы они не индексировали эту страницу
	if (count($this->items)<1) :
		$document->setMetadata('robots', 'noindex, nofollow');
	endif;
	// Если нужно указать поисковикам чтобы они не индексировали страницы тегов/меток то,
	// раскомментируйте строку идущую сразу под этим комментарием, удалив два слэша "/" в ее начале.
	//$document->setMetadata('robots', 'noindex, nofollow');
	$document->addHeadLink($livesite . $docroute, 'canonical', 'rel', '');
endif;
// ------------ End Canonical-Mod

Открываем файл components/com_k2/templates/default/user.php

после

// no direct access
defined('_JEXEC') or die('Restricted access');

добавляем

// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
	$document = JFactory::getDocument();
	$livesite = substr_replace(JURI::root(), '', -1, 1);
	$docroute = JRoute::_(K2HelperRoute::getUserRoute($this->user->id));
	// Начало проверки системной ссылки в запросе
	$requrl = trim(JFactory::getURI()->toString());
	(bool)$valideurl = strpos( $requrl, $docroute );
	// Если системная ссылка в запросе отсутствует
	if ( $valideurl === false) :
		// отдаем ошибку 404
		JError::raiseError(404, JText::_('K2_USER_NOT_FOUND'));
	endif;
	// Конец проверки системной ссылки в запросе
	// Если у пользователя нет материала, то указываем поисковикам чтобы они не индексировали его страницу
	if (count($this->items)<1) :
		$document->setMetadata('robots', 'noindex, nofollow');
	endif;
	// Если нужно указать поисковикам чтобы они вообще не индексировали страницы пользователей то,
	// раскомментируйте строку идущую сразу под этим комментарием, удалив два слэша "/" в ее начале.
	//$document->setMetadata('robots', 'noindex, nofollow');
	$document->addHeadLink($livesite . $docroute, 'canonical', 'rel', '');
endif;
// ------------ End Canonical-Mod

Необязательное дополнение для указания запрета индексации форм добавления материала.

Открываем файл components/com_k2/templates/default/itemform.php

после

$document = & JFactory::getDocument();

добавляем

$document->setMetadata('robots', 'noindex, nofollow');

 Ну и, если мы не хотим каждый раз после обновления К2 вносить эти изменения в шаблоны, копируем папку components/com_k2/templates/default

в папку шаблона Joomla templates/МОЙ ШАБЛОН/html/com_k2/templates/default

Но возможно вы не хотите или не умеете работать с кодом, есть альтернатива.
Это плагины:
  1. Плагин (От наших русских разработчиков. Последняя актуальная версия для Joomla 2.5 - 2.2.0): JL No Doubles
  2. Плагин (Версия 3.+): K2 Canonical Links
web7pc.com
Precios para: Crear pagina web | Crear Tiendas Online | Posicionamiento SEO
Comprar robots para: Milanuncios | Vibbo | A medida
Otras preguntas pincha:  AQUÍ

Убедитесь, что Вы ввели всю требуемую информацию, в поля, помеченные звёздочкой (*). HTML код не допустим.