Работаем с SEO-шаблонами. Настройка. Доработка

Работаем с SEO-шаблонами. Настройка. Доработка

Уже достаточно давно, еще с 14-й версии модуля "Информационные блоки" в 1С-Битрикс появилась возможность задавать шаблоны автоматической генерации мета-данных. Но не все до сих пор умеют пользоваться данным инструментом. В данном посте собраны основные моменты по созданию шаблонов мета-данных.

Данный механизм на основе заранее заготовленного шаблона позволяет генерировать мета-данные (description, title,keywords) для элементов и разделов, а также для элементов доступны шаблоны для установки alt, title и шаблона имени файла детального и анонсового изображений.

В шаблоне может быть несколько вариантов данных.

Во-первых, это, конечно-же, может быть любой произвольный текст. Этот текст будет выведен автоматически у заданного объекта (и всех потомков, если это раздел, так что не забывайте у потомков написать свой уникальный текст).

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

Вот список зарезервированных слов:

  • this - означает текущий объект;
  • parent - родительский объект. Пример: {=parent.PreviewText} - анонсовый текст родительского раздела;
  • sections - родительские секции начиная с верхнего уровня. пример: {=this.sections.name} - названия родительских разделов;
  • iblock - инфоблок текущего объекта. Пример: {=iblock.PreviewText} - описание инфоблока;
  • property - свойство текущего объекта. Пример: {=this.property.CML_ARTICLE} - выведет значение свойства с артикулом. Для того чтобы у элемента показать пользовательское свойство, заданное для раздела, можно воспользоваться шаблоном: {=this.parent.property.name} - выдаст значение свойства UF_NAME;
  • Для редакций, имеющих модуль Торговый каталог, можно также получить свойство торгового предложения: {=this.catalog.sku.property.COLOR} - выдаст значение свойства "Цвет" торгового предложения. Чтобы получить значения данного свойства у торговых предложений, но без повторяющихся значений, можно воспользоваться функцией: {=distinct this.catalog.sku.property.COLOR};
  • Чтобы получить цены торговых предложений, необходимо указать тип цены, которая должна быть выведена:{=this.catalog.sku.price.BASE;} - выдаст все цены, либо так: {=min this.catalog.sku.price.BASE} можно получить минимальную цену;
  • Для получения габаритов товара, необходимо обратиться к соответствующим данным: {=this.catalog.weight} - вес товара, {=this.catalog.measure} - единица измерения, {=concat catalog.store ", "} - склады, перечисленные через запятую
  • Для редакций, имеющих модуль Торговый каталог, можно также получить свойство торгового предложения: {=this.catalog.sku.property.COLOR} - выдаст значение свойства "Цвет" торгового предложения. Чтобы получить значения данного свойства у торговых предложений, но без повторяющихся значений, можно воспользоваться функцией: {=distinct this.catalog.sku.property.COLOR};
  • Чтобы получить цены торговых предложений, необходимо указать тип цены, которая должна быть выведена:{=this.catalog.sku.price.BASE;} - выдаст все цены, либо так: {=min this.catalog.sku.price.BASE} можно получить минимальную цену;
  • Для получения габаритов товара, необходимо обратиться к соответствующим данным: {=this.catalog.weight} - вес товара, {=this.catalog.measure} - единица измерения, {=concat catalog.store ", "} - склады, перечисленные через запятую

Набор готовых конструкций достаточно большой и решает большую часть задач описания мета-данных. Дополнением к данным конструкциям служат предопределенные функции:

  • lower - приведет значение к нижнему регистру. Пример: {=lower this.Name};
  • upper - приведет значение к верхнему регистру. Пример: {=upper this.Name};
  • limit - ограничить элементы по разделителю. Пример: {=limit {=this.PreviewText} "." 2} - оставит текст до 2 точки, начиная с начала;
  • concat - задаётся разделитель и несколько строк объединяются через разделитель. Пример: {=concat this.sections.name " / "} - все названия родительских разделов будут соединены с помощью слэша;
  • min - находит минимальный элемент. Пример: {=min this.catalog.sku.price.BASE};
  • max - находит максимальный элемент. Пример: {=max this.catalog.sku.price.BASE};
  • distinct - оставит только значения без повторения(уникальные).;
  • translit - транслитерация значения. Пример: {=translit this.Name};
  • concat - задаётся разделитель и несколько строк объединяются через разделитель. Пример: {=concat this.sections.name " / "} - все названия родительских разделов будут соединены с помощью слэша;
  • min - находит минимальный элемент. Пример: {=min this.catalog.sku.price.BASE};
  • max - находит максимальный элемент. Пример: {=max this.catalog.sku.price.BASE};

Конечно же список функций можно расширять до бесконечности. Для этого, нужно воспользоваться обработчиком события OnTemplateGetFunctionClass модуля "Информационные блоки".

В качестве примера рассмотрим создание функции, выводящей значение свойства только тогда, когда свойство заполнено. В init.php создаем обработчик события:

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
     "iblock",
     "OnTemplateGetFunctionClass",
     array("ManaoIblockSeoTemplate", "eventHandler")
  );
  
  class ManaoIblockSeoTemplate{
      public static function eventHandler($event)
      {
         $parameters = $event->getParameters();
         $functionClass = $parameters[0];
         if(is_string($functionClass)){
            switch ($functionClass){
                case 'manao_limitchars': //выводить определенное количество символов
            	return new Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS,"\\FunctionLimitChars");
            }
        }
      }
  }

//подключаем файл с классом FunctionBase, т.к. автозагрузка еще не реализована
include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/lib/template/functions/fabric.php");
class FunctionLimitChars extends Bitrix\Iblock\Template\Functions\FunctionBase
{
	public function calculate($parameters)
	{
		$arParams = $this->parametersToArray($parameters);
		$limit = intval(array_pop($arParams));
		$text = strip_tags(trim(implode(" ", $arParams)));
		$words = explode(" ", $text);

		if ($limit === 0)
			return $text;

		$result = "";
		foreach ($words as $word)
		{
			$word = trim($word);
			if (strlen($result) === 0)
			{
				$result = $word;
			}
			elseif (strlen($result . " " . $word) >= $limit)
			{
				break;
			}
			else
			{
				$result .= " " . $word;
			}
		}

		return $result;
	}
}

Чтобы воспользоваться данным шаблоном, нужно прописать его в виде:

Купить {=take_first this.property.HEADER this.Name}. Цена {=this.catalog.price.BASE} в интернет-магазине ...


Возврат к списку

На верх