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

init.php выполняется до подключения шаблона. Поэтому вызов в нем $APPLICATION->GetPagePropertyList(); приветет к ошибке.
Специально проверил, вот код ошибки: Fatal error: Call to a member function SetPageProperty()

Дмитрий

01.10.2014 12:25:20

Я к тому что в вашем коде явно не хватает global $APPLICATION;

Максим

01.10.2014 16:57:13

Действительно в примере кода я упустил строчку
global $APPLICATION;

Поправил пример.

Большое спасибо!

Татьяна

02.10.2014 10:31:29

Большое человеческое спасибо! Для впервые взявшихся за Битрикс -- занятие мозготравмирующее ...

Дмитрий

02.10.2014 16:08:02

Да, статья стоящая. Правда я использовал данный материал с другой целью нежели автор, но всетаки он мне очень помог. Добавил в закладки сайт. :-)

Максим

03.10.2014 15:35:33

Спасибо, рад что статья оказалась полезна.

Дмитрий

03.10.2014 18:27:12

Подскажите, а вы случайно не имели дело с ajax в битрикс?

У меня проблема такого характера. Есть компонент bitrix:catalog.section. В нем включен режим ajax. В другом компоненте хочу задавать сортировку в этом. Для этого необходимо получить ajax-id компонента.

Пытаюсь это сделать так:
$bxajaxid = CAjax::GetComponentID("bitrix:catalog.section", "projects");

Мне приходит ID, но какой-то левый :(

Максим

03.10.2014 22:09:14

Думаю так не получится. Попробуйте bitrix:catalog.section вызывать из шаблона того другого компонента, не забудьте добавить в вызов переменную $component

Александр

24.03.2015 18:14:49

Здравствуйте. Скажите, а с помощью этой статьи можно для динамических страниц в компоненте "каталог" прописать свои мета теги отдельно для каждой страницы?

Максим

24.03.2015 18:52:41

Александр, в компоненте каталог можно задавать свои мета параметры keywords и description, для этого в настройках компонента есть параметры:
"Установить ключевые слова страницы из свойства" и
"Установить описание страницы из свойства".
Также не так давно в битриксе в админке на странице редактирования инфоблока появилась вкладка SEO, где вы также можете задать из каких свойств элемента формировать мета параметры.

Т.е. вам нужно в настройках инфоблока создать дополнительные свойства для элемента: KEYWORDS и DESCRIPTION. А затем либо в настройках инфоблока, либо в настройках компонента выбрать, чтобы мета параметры брались из созданных свойств.

PS это касается только keywords и description. А например, og:description настроить штатно возможности нет, тут нужно дописывать. Для стандартных компонентов можно пользоваться файлами result_modifier.php и component_epilog.php.

В файле result_modifier.php нужно прокинуть через кеш сео параметры, например:

$arResult['META']['OG:DESCRIPTION'] = $arResult['ELEMENT']['PROPERTY_OGDESCRIPTION_VALUE'];
...
$this->SetResultCacheKeys(array('META'));

где OGDESCRIPTION код созданного свойства

А в файле component_epilog.php просто вызвать функцию:

setMeta($arResult['META']);


При этом саму фунцию и обработку события поместить в файл init.php

Александр

24.03.2015 19:00:50

Максим, очень Вам благодарен за столь быстрый и подробный ответ! Если не затруднит, объясните как в настройках инфоблока создать эти дополнительные свойства?

Максим

25.03.2015 06:19:42

Александр, http://c2n.me/3ePPaA4

Оставить комментарий:

Представьтесь пожалуйста:
Электронная почта:
Электронный адрес не публикуются
Текст сообщения:
Для подсветки кода, оборачивайте ваш код в теги <code></code>
Введите 5 цифр с картинки:

Рекомендую:

Поддержать проект:

бесполезная кнопка, которую еще никто не нажал:)
Нажали! Кнопку нажали уже 7 человек!!! Спасибо, очень мотивирует!