ChilliVilli,
cerammix,
yestravel, вот усовершенствованный вариант решения:
Точно также, создаем файл /modules/core/utils.php со следующим кодом:
<?php
defined('HOSTCMS') || exit('HostCMS: access denied.');
/**
* Some useful helpers
*
* @package HostCMS 6\Core
* @version 6.x
* @author James V. Kotoff
* @copyright 2013-2015
* @access public free
*
* path to file: /modules/core/utils.php
*
*/
class Core_Utils
{
/**
* Core_Utils::getCanonicalUrl() - вычисляет канонический адрес страницы для link rel="canonical"
*
* @param boolean [$useParentShopItem = false] В интернет-магазине, для страниц товаров-модификаций считать каноническим урл родительского товара. По умолчанию выключено.
* @param string [$sFirstPageSuffix = 'page-1/'] Суффикс пейджинга на первую страницу, удаляется из урла, чтобы каноническим урлом первой страницы был урл без пейджинга.
* @return string
*
* @example:
* <link rel="canonical" href="<?=Core_Utils::getCanonicalUrl(TRUE); ?>"/>
*
*/
static public function getCanonicalUrl($bUseParentShopItem = false, $sFirstPageSuffix = 'page-1/')
{
$sLink = '';
$object = Core_Page::instance()->object;
// если включен режим подстановки родительского товара вместо модификации
// и текущая страница является страницей товара в магазине
if ($bUseParentShopItem && is_object($object) && $object instanceof Shop_Controller_Show && $object->item)
{
// получаем товар
$oShop_Item = Core_Entity::factory('Shop_Item', $object->item);
// если товар найден и это модификация
if ($oShop_Item && $oShop_Item->modification_id)
{
// формируем относительный путь к родительскому товару
$oShop = Core_Entity::factory('Shop', $oShop_Item->shop_id);
$sLink = $oShop->Structure->getPath() . $oShop_Item->Modification->getPath();
}
}
// если мы еще не вычислили ссылку ранее, то преобразуем текущий request_uri
if (!$sLink)
{
$aLink = explode('?', Core_Array::get($_SERVER, 'REQUEST_URI', ''));
$sLink = reset($aLink);
// проверим, что это не пейджинг на первую страницу
$FirstPageSuffixLength = mb_strlen($sFirstPageSuffix);
if (mb_substr($sLink, (0 - $FirstPageSuffixLength)) == $sFirstPageSuffix)
{
// если это пейджинг на первую страницу, то уберем ее суффикс из урла
$sLink = mb_substr($sLink, 0, mb_strlen($sLink)-$FirstPageSuffixLength);
}
}
// получим главный алиас текущего сайта
$oSite_Alias = Core_Entity::factory('Site', CURRENT_SITE)->getCurrentAlias();
if($oSite_Alias) {
// определим метод доступа у текущему узлу структуры, http или https
$oStructure = Core_Entity::factory('Structure', CURRENT_STRUCTURE_ID);
$scheme = $oStructure->https ? 'https' : 'http';
// дополняем относительную ссылку до абсолютной
$sLink = $scheme. '://' . $oSite_Alias->alias_name_without_mask . $sLink;
}
// вернем результат
return $sLink;
}
}
А вот вызов немного поменяется.
По умолчанию можно также как раньше
<link rel="canonical" href="<?=Core_Utils::getCanonicalUrl(); ?>"/>
Если хотите чтобы для модификаций каноническим урлом были родительские товары, то
<link rel="canonical" href="<?=Core_Utils::getCanonicalUrl(TRUE); ?>"/>
Если у вас нестандартный суффикс первой страницы (например, pg_1, pg_2 и т.д.) и при этом вы еще и хотите чтобы для модификаций каноническим урлом были родительские товары, то
<link rel="canonical" href="<?=Core_Utils::getCanonicalUrl(TRUE, 'pg_1/'); ?>"/>
Просто нестандартный суффикс, без поддержки модификаций товаров
<link rel="canonical" href="<?=Core_Utils::getCanonicalUrl(FALSE, 'pg_1/'); ?>"/>