Meta для всех
Сейчас я расскажу, как организовать вывод различных мета тегов на страницах, как динамических, так и статических. Bitrix позволяет задавать такие мета теги как keywords и description.
Для динамических страниц можно в настройках стандартных компонентов указать из какого свойства устанавливать ключевые слова (keywords) и описание страницы (description):
Для статических страниц keywords и description задаются в свойствах страницы, также для этого есть отдельная СЕО панель в публичной части сайта:
Но как же быть, если нужно задать дополнительные мета теги?
Например: og:title, og:description, og:image, og:type, fb:admins, fb:app_id
Для этого я реализовал универсальный механизм добавления дополнительных мета тегов на статические и динамические страницы.
Статические страницы
Для дополнительных мета тегов также воспользуемся свойствами страницы. Произвольные свойства для страницы можно задавать при редактировании через панель управления:
Добавим необходимые нам свойства. Но пока ничего не произойдет. Автоматически в виде мета тегов выводятся только три свойства страницы, это robots, keywords, description, чтобы выводить остальные свойства, нужно в файл inip.php добавить следующий код:
AddEventHandler('main', 'OnEpilog', 'onEpilog', 1);
function onEpilog(){
global $APPLICATION;
$arPageProp = $APPLICATION->GetPagePropertyList();
$arMetaPropName = array('og:title','og:description','og:image','og:type','fb:admins','fb:app_id');
foreach ($arMetaPropName as $name){
$key = mb_strtoupper($name, 'UTF-8');
if (isset($arPageProp[$key])){
$APPLICATION->AddHeadString('<meta property="'.$name.'" content="'.htmlspecialchars($arPageProp[$key]).'">',$bUnique=true);
}
}
}
Мы добавили обработку события onEpilog, которое происходит в конце формирования страницы. В ней мы получаем все заданные свойства страницы $APPLICATION->GetPagePropertyList(), задаем массив дополнительных мета тегов $arMetaPropName. Пробегаем дополнительные мета теги, если у страницы заполнено такое свойство, то сформируем и добавим соответствующий тег <meta>.
ПРИМЕЧАНИЕ: ключи свойств страницы всегда хранятся в верхнем регистре. Для получения ключа используем конструкцию $key = mb_strtoupper($name, 'UTF-8');
Динамические страницы
В компоненте (в некешируемой его части) нужно задать свойства страницы, например:
$APPLICATION->SetPageProperty('og:description', $arResult['META']['OG:DESCRIPTION']);
Я описывал этот механизм применительно к "стандартным" мета тегам в разделе Структура компонента
Чтобы не расширять и не копировать из компонента в компонент код:
if($arResult['META']['H1']){
$APPLICATION->SetTitle($arResult['META']['H1']);
}
if($arResult['META']['TITLE']){
$APPLICATION->SetPageProperty('title', $arResult['META']['TITLE']);
}
if($arResult['META']['DESCRIPTION']){
$APPLICATION->SetPageProperty('description', $arResult['META']['DESCRIPTION']);
}
if($arResult['META']['KEYWORDS']){
$APPLICATION->SetPageProperty('keywords', $arResult['META']['KEYWORDS']);
}
Я его заменил на более универсальную функцию: setMeta($arResult['META']);
function setMeta($arMeta){
global $APPLICATION;
if( isset($arMeta['H1']) && strlen($arMeta['H1']) ){
$APPLICATION->SetTitle($arMeta['H1']);
unset($arMeta['H1']);
}
foreach ($arMeta as $key=>$value){
if( strlen($arMeta[$key]) ){
$APPLICATION->SetPageProperty($key, $value);
}
}
//facebook_appid
$fbApiId = COption::GetOptionString('socialservices','facebook_appid');
if( $fbApiId && strlen($fbApiId)){
$APPLICATION->SetPageProperty('fb:app_id', $fbApiId);
}
}
Здесь отделяем тег H1 от остальных, потому что он устанавливается по другому, а также получаем свойство сайта facebook_appid, если оно есть, устанавливаем тег fb:app_id
Комментарии:
Дмитрий
01.10.2014 12:22:39
Специально проверил, вот код ошибки: Fatal error: Call to a member function SetPageProperty()
Дмитрий
01.10.2014 12:25:20
Максим
01.10.2014 16:57:13
Поправил пример.
Большое спасибо!
Татьяна
02.10.2014 10:31:29
Дмитрий
02.10.2014 16:08:02
Максим
03.10.2014 15:35:33
Дмитрий
03.10.2014 18:27:12
У меня проблема такого характера. Есть компонент bitrix:catalog.section. В нем включен режим ajax. В другом компоненте хочу задавать сортировку в этом. Для этого необходимо получить ajax-id компонента.
Пытаюсь это сделать так:
$bxajaxid = CAjax::GetComponentID("bitrix:catalog.section", "projects");
Мне приходит ID, но какой-то левый :(
Максим
03.10.2014 22:09:14
Александр
24.03.2015 18:14:49
Максим
24.03.2015 18:52:41
"Установить ключевые слова страницы из свойства" и
"Установить описание страницы из свойства".
Также не так давно в битриксе в админке на странице редактирования инфоблока появилась вкладка SEO, где вы также можете задать из каких свойств элемента формировать мета параметры.
Т.е. вам нужно в настройках инфоблока создать дополнительные свойства для элемента: KEYWORDS и DESCRIPTION. А затем либо в настройках инфоблока, либо в настройках компонента выбрать, чтобы мета параметры брались из созданных свойств.
PS это касается только keywords и description. А например, og:description настроить штатно возможности нет, тут нужно дописывать. Для стандартных компонентов можно пользоваться файлами result_modifier.php и component_epilog.php.
В файле result_modifier.php нужно прокинуть через кеш сео параметры, например:
где OGDESCRIPTION код созданного свойства
А в файле component_epilog.php просто вызвать функцию:
При этом саму фунцию и обработку события поместить в файл init.php
Александр
24.03.2015 19:00:50
Максим
25.03.2015 06:19:42
Оставить комментарий: