SEO-модуль 1С-Битрикс, strip_tags Description и Keywords

21.09.2014  02:43

В 14-й версии Битрикс, наконец-то, сделали удобное формирование meta-тегов Description и Keywords. Сделать-то, сделали, даже реализовали limit — ограничение по количеству слов (а не символов, спешите видеть). А strip_tags нет! Как так?! Все сеошники тут же завалили форум Битрикса однотипными вопросами: как вырезать теги в новом волшебном SEO-модуле и как ограничивать по символам (а не по словам). Да и как проверять на заполненность полей, склеиваемых в Description/Keywords.

Скоро год пройдёт, а решения от Битрикса так и нет. Обещанного три года ждут. Ну, да мы и сами как-нибудь.
В /bitrix/php_interface/init.php регистрируем обработчик:

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/iblock/lib/template/functions/fabric.php');
use BitrixMain;
$eventManager = MainEventManager::getInstance();
$eventManager->addEventHandler("iblock", "OnTemplateGetFunctionClass", "myOnTemplateGetFunctionClass");
include_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/php_interface/include/classes/seo.php");
function myOnTemplateGetFunctionClass(BitrixMainEvent $event) {
   $arParam = $event->getParameters();
   $functionClass = $arParam[0];
   if (is_string($functionClass) && class_exists($functionClass) && $functionClass=='ap_sseo'){
      $result = new BitrixMainEventResult(1,$functionClass);
      return $result;
   }
}


Самое интересное у нас будет происходить в /bitrix/php_interface/include/classes/seo.php
class ap_sseo extends BitrixIblockTemplateFunctionsFunctionBase
{
   public function onPrepareParameters(BitrixIblockTemplateEntityBase $entity, $parameters)
   {
      $arguments = array();
      /** @var BitrixIblockTemplateNodeBase $parameter */
      foreach ($parameters as $parameter)
      {
         $arguments[] = $parameter->process($entity);
      }
      return $arguments;
   }
   public function calculate(array $parameters)
   {
   foreach ($parameters as $key => $parameter)
   {
	$parameters[$key] = strip_tags($parameter);//вырезать теги (спасибо, Кэп)
	$parameters[$key] = preg_replace("/(\t+)/is","",$parameters[$key]);//вырезать табуляции
	$parameters[$key] = preg_replace("/(\s+){2,}/is"," ",$parameters[$key]);//заменить двойные пробелы одинарными
	$parameters[$key] = preg_replace("/(\r\n)+/i", "", $parameters[$key]);//удалить переводы строки
	//$parameters[$key] = mb_substr($parameters[$key],0,250);
   }
      if(isset($parameters[0]) && $parameters[0] && isset($parameters[1])) {
         return sprintf(mb_substr($parameters[1],$parameters[0],0,250));
      }
	  else return sprintf(mb_substr($parameters[0],0,250));
      return "";
   }
}


Готово! Из Description и keywords вырезаются все теги с помощью strip_tags и регулярными выражениями meta-теги приводятся в божеский вид: вырезается вся табуляция и переводы строк, двойные пробелы заменяются одинарными и, финально, поля обрезаются по длине (в лоб по 250 символов без учёта окончаний слов).

При желании можете его покрутить. Я не доделал обработку нескольких директив, почему-то происходит какая-то ересь и этот костыль можно использовать только с одной директивой: {=ap_sseo this.DetailText}
Это добавить в настройках инфоблока во вкладке SEO в поля «Шаблон META DESCRIPTION» и «Шаблон META KEYWORDS».

Совместное использование директив не прокатило {=ap_sseo limit this.DetailText " " 30}, не знаю почему такая строка не хочет работать.

Пользуйтесь!
Лучи добра разработчикам Битрикса!
Андрей Панёвин
Здравствуйте! Я — Андрей Панёвин и занимаюсь профессиональной разработкой сайтов на платформе 1С-Битрикс (исключительно программирование). Есть вопросы по статье? Могу подсказать и помочь по скайпу (andrey.panevin.ru), WhatsApp (+7-911-091-0670) или перепиской в ВК.
1000 р./час.



перейти в Блог | Блог (стр. 11)

Ударим лайками по бездорожью, разгильдяйству и бюрократизму!


Ключевые слова (тэги): 1С-Битрикс 46  SEO 14  web-программирование 82  

Вам есть что сказать — ну я же чую.
Высказаться о наболевшем, я выслушаю:
Имя


email (не публикуется)