пятница, 2 октября 2015 г.

Как убрать дубли страниц в Joomla

Во все файлы шаблона, КРОМЕ index.php, и html/com_content/form/edit.php, добавлено условие запрета генерации ссылки каноникал для главной страницы.
Это сделанно для избежания дублирования ссылки каноникал на главной и редиректа, если в качестве главной указывается определенный материал.

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

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

http://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 будет знать о том, что содержание этих страниц одинаково, то сможет добавить в результаты поиска только одну из них. Наши алгоритмы выбирают ту страницу, которая, по нашему мнению, лучше всего отвечает на запрос пользователя. Тем не менее, теперь пользователи могут указывать поисковым системам каноническую страницу, добавив элемент <link> с атрибутом rel="canonical" в раздел <head> неканонической версии страницы. Добавление этой ссылки и атрибута позволяет владельцам сайтов определять наборы идентичного содержания и сообщать Google: "Из всех страниц с идентичным содержанием эта является наиболее полезной. Установите для нее наивысший приоритет в результатах поиска."

Цитата: Яндекс
Атрибут rel="canonical" тега <link>
В том случае, если на сайте присутствуют группы схожих по контенту страниц, вебмастер может выбрать предпочитаемый (канонический) 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. Нашли ошибку? Пишите, попробуем разобраться.
4. При обновлении заменяем весь код находящийся между строками
Код:
// ------------ Start Canonical-Mod
и
Код:
// ------------ End Canonical-Mod

Ссылка Canonical для главной страницы. 
Открываем файл templates/МОЙ ШАБЛОН/index.php
Скрыть текстовый блок
после
Код
// No direct access.
defined('_JEXEC') or die;
 
добавляем
Код
// ------------ 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
 

Ссылка Canonical для страниц компонента материалов (com_content)
Открываем файл templates/МОЙ ШАБЛОН/html/com_content/archive/default.php
Скрыть текстовый блок
после
Код
// no direct access
defined('_JEXEC') or die;
 
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
 
добавляем
Код
// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
 $app = JFactory::getApplication();
 $document = JFactory::getDocument();
 $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='.$app->getMenu()->getActive()->id);
 
 $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', '');
endif;
// ------------ End Canonical-Mod
 

Открываем файл templates/МОЙ ШАБЛОН/html/com_content/article/default.php
Скрыть текстовый блок
после
Код
// no direct access
defined('_JEXEC') or die;
 
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
 
добавляем
Код
// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
 $requrl = trim($_SERVER['REQUEST_URI']);
 $document = JFactory::getDocument();
 $livesite = substr_replace(JURI::root(), '', -1, 1);
 
 $docpagenr = '';
 $docstart = JRequest::getInt('start',0);
 if($docstart>0) :
  // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница материала
  //$docpagenr = '?start='.$docstart;
 endif;
 $docroute = $this->item->readmore_link;
 
 // Начало проверки системной ссылки в запросе. (для редиректа 301 или отдачи ошибки 404.)
 (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 . $docpagenr, 'canonical', 'rel', '');
endif;
// ------------ End Canonical-Mod
 

Открываем файл templates/МОЙ ШАБЛОН/html/com_content/categories/default.php
Скрыть текстовый блок
после
Код
// no direct access
defined('_JEXEC') or die;
 
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers');
 
добавляем
Код
// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
 $document = JFactory::getDocument();
 $livesite = substr_replace(JURI::root(), '', -1, 1);
 
 $docpagenr = '';
 $docstart = JRequest::getInt('start',0);
 if($docstart>0) :
  // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница категории
  //$docpagenr = '?start='.$docstart;
 endif;
 
 $docroute = JRoute::_(ContentHelperRoute::getCategoryRoute($this->parent->id));
 
 $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', '');
endif;
// ------------ End Canonical-Mod
 

Открываем файл templates/МОЙ ШАБЛОН/html/com_content/category/blog.php
Скрыть текстовый блок
после
Код
// no direct access
defined('_JEXEC') or die;
 
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers');
 
добавляем
Код
// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
 $document = JFactory::getDocument();
 $livesite = substr_replace(JURI::root(), '', -1, 1);
 
 $docpagenr = '';
 $docstart = JRequest::getInt('start',0);
 if($docstart>0) :
  // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница категории
  //$docpagenr = '?start='.$docstart;
 endif;
 
 $docroute = JRoute::_(ContentHelperRoute::getCategoryRoute($this->category->id));
 
 $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', '');
endif;
// ------------ End Canonical-Mod
 

Открываем файл templates/МОЙ ШАБЛОН/html/com_content/category/default.php
Скрыть текстовый блок
после
Код
// no direct access
defined('_JEXEC') or die;
 
JHtml::addIncludePath(JPATH_COMPONENT.'/helpers');
 
добавляем
Код
// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
 $document = JFactory::getDocument();
 $livesite = substr_replace(JURI::root(), '', -1, 1);
 
 $docpagenr = '';
 $docstart = JRequest::getInt('start',0);
 if($docstart>0) :
  // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница категории
  //$docpagenr = '?start='.$docstart;
 endif;
 
 $docroute = JRoute::_(ContentHelperRoute::getCategoryRoute($this->category->id));
 
 $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', '');
endif;
// ------------ End Canonical-Mod
 

Открываем файл templates/МОЙ ШАБЛОН/html/com_content/featured/default.php
Скрыть текстовый блок
после
Код
// no direct access
defined('_JEXEC') or die;
 
JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
 
добавляем
Код
// ------------ Start Canonical-Mod
$mainmenu =& JSite::getMenu();
if($mainmenu->getActive()!== $mainmenu->getDefault()) :
 $app = JFactory::getApplication();
 $document = JFactory::getDocument();
 $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='.$app->getMenu()->getActive()->id);
 
 $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', '');
endif;
// ------------ End Canonical-Mod
 

Необязательный шаг. Чисто для указания запрета индексации формы добавления/редактирования материала. 
Открываем файл templates/МОЙ ШАБЛОН/html/com_content/form/edit.php
Скрыть текстовый блок
после
Код
// Create shortcut to parameters.
$params = $this->state->get('params');
 
добавляем
Код
$document = & JFactory::getDocument();
$document->setMetadata('robots', 'noindex, nofollow');
 


//------------------------------------------------------------------------------------------------------------------------------------------//


Как дополнение желательно делать запрет на индексацию страниц с параметрами ?limitstart и ?limit добавив их в файл robots.txt
Код:
Disallow: *?limitstart
Disallow: *?limit

Для тех у кого нет файлов-шаблонов в templates/МОЙ ШАБЛОН/html/com_content/ и они не знают где их взять
Скрыть текстовый блок
копируем components/com_content/views/archive/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/archive/default.php
копируем components/com_content/views/article/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/article/default.php
копируем components/com_content/views/categories/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/categories/default.php
копируем components/com_content/views/category/tmpl/blog.php в templates/МОЙ ШАБЛОН/html/com_content/category/blog.php
копируем components/com_content/views/category/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/category/default.php
копируем components/com_content/views/featured/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/featured/default.php
копируем components/com_content/views/form/tmpl/edit.php в templates/МОЙ ШАБЛОН/html/com_content/form/edit.php

PS. Следите за обновлениями поста, возможны правки!

0 коммент.:

Отправить комментарий