Как избежать ухудшения SEO при использовании виртуальных копий — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 70: Строка 70:
 
Макрос работает следующим образом:
 
Макрос работает следующим образом:
  
1) проверяет есть у этой страницы виртуальные копии,
+
<ul>
2) если есть, то берется первая страницы, с которой были сделаны копии, и выводится <link rel="canonical" href="путь_первоначальной_страницы"/>,
+
<li>проверяет есть у этой страницы виртуальные копии,</li>
3) если копий нет или передан id первоначальной страницы, то ничего не выводится.
+
<li>если есть, то берется первая страницы, с которой были сделаны копии, и выводится <link rel="canonical" href="путь_первоначальной_страницы"/>,</li>
 +
<li>если копий нет или передан id первоначальной страницы, то ничего не выводится.</li>
 +
</ul>
  
 
Макрос нужно поместить внутри тега <head>, пример вызова в xslt:
 
Макрос нужно поместить внутри тега <head>, пример вызова в xslt:

Версия 13:29, 11 марта 2014

Актуально для версии 2.9.5

Задача

Когда у Вас на сайте очень большой каталог бывает полезно размешать виртуальные копии одного товара в разных разделах. Но это плохо сказывается на SEO, так как происходит дублирование контента по разным адресам Вашего сайта. Решить проблему можно с помощью Google Canonical [1], но Вы же не хотите добавлять его вручную. Необходимо написать кастомный макрос, пример оного дан ниже.

Решение

%custom makeRelCanonical()% — выводит Google Canonical для страницы.

Параметры: custom makeRelCanonical([$page_id = false])

$page_id

  Идентификатор страницы, Google Canonical которой требуется вывести. Если параметр не указан, то берется id текущей страницы, макрос нельзя вызывать через HTTP SCHEME MODE без указания этого параметра.

Для применения этого макроса скопируйте код макроса в файл /classes/modules/custom.php.

Код макроса

public function makeRelCanonical($page_id = false){
		
			$current_page_id = cmsController::getInstance()->getCurrentElementId();
			$hierarchy_col = umiHierarchy::getInstance();
			$domain_col = domainsCollection::getInstance(); 
			
			if($page_id == false){
				if($current_page_id == false && defined('VIA_HTTP_SCHEME')){
					throw new publicException('cant get current element via HTTP SCHEME MODE');
				}
				$page_id = $current_page_id;
				$page = $hierarchy_col->getElement($page_id, true, true);
				$object_id = $page->getObjectId();
				$parents_ids = $hierarchy_col->getObjectInstances($object_id, true, true);
				if(count($parents_ids) == 0 || count($parents_ids) == 1 || $parents_ids[0] == $page_id){
					return '';
				}
				$first_parent_id = $parents_ids[0];			
				$path = $hierarchy_col->getPathById($first_parent_id);			
				$domain_id = $hierarchy_col->getElement($first_parent_id, true, true)->getDomainId();			
				$domain_name = $domain_col->getDomain($domain_id)->getHost();
				
				return '<link rel="canonical" href="' . 'http://' . $domain_name . $path . '"/>';			
			}else{
				$page_id = intval($page_id);
				if($page_id == 0){
					throw new publicException('wrong id given');
				}
				$page = $hierarchy_col->getElement($page_id, true, true);
				if($page == false){
					throw new publicException('page with id = ' . $page_id . ' not found');
				}
				$object_id = $page->getObjectId();			
				$parents_ids = $hierarchy_col->getObjectInstances($object_id, true, true);		
				if(count($parents_ids) == 0 || count($parents_ids) == 1 || $parents_ids[0] == $page_id){
					return '';
				}
				$first_parent_id = $parents_ids[0];		
				$path = $hierarchy_col->getPathById($first_parent_id);	
				$domain_id = $hierarchy_col->getElement($first_parent_id, true, true)->getDomainId();	
				$domain_name = $domain_col->getDomain($domain_id)->getHost();
		
				return '<link rel="canonical" href="' . 'http://' . $domain_name . $path . '"/>';
			}
		}

Макрос работает следующим образом:

  • проверяет есть у этой страницы виртуальные копии,
  • если есть, то берется первая страницы, с которой были сделаны копии, и выводится <link rel="canonical" href="путь_первоначальной_страницы"/>,
  • если копий нет или передан id первоначальной страницы, то ничего не выводится.

Макрос нужно поместить внутри тега <head>, пример вызова в xslt:

<xsl:value-of select="document('udata://custom/makeRelCanonical/')/udata" disable-output-escaping="yes" />

в tpl:

%custom makeRelCanonical()%