В этой статье хотелось бы рассказать об одном из вариантов реализации работы с META-тэгами Description и Keywords в MODx.
Если на сайте используются уникальные описания и ключевые слова, которые нельзя генерировать автоматически, то достаточно создать два TV-параметра meta-description и meta-keywords с типом ввода Text. А затем подключить их в шаблоне:
... <head> ... <meta name="keywords" content="[*meta-keywords*]" /> <meta name="description" content="[*meta-description*]" /> ... </head> ...
Если же на сайте есть страницы, для которых эти META-тэги можно генерировать автоматически, то можно использовать следующий способ: так же создаем два TV-параметра meta-description и meta-keywords, но в шаблоне выводим META-тэги с помощью сниппета.
Назовем сниппет html_getMeta. У сниппета будет всего один параметр type, который может принимать значения description или keywords. В зависимости от этого параметра будет возвращаться соответственно либо описание страницы, либо ключевые слова.
Получить значения TV-параметров в сниппете можно следующим образом:
$keywords = $modx->getTemplateVar('meta-keywords', '*', $modx->documentIdentifier);
$keywords = $keywords['value'];
$description = $modx->getTemplateVar('meta-description', '*', $modx->documentIdentifier);
$description = $description['value'];
Логика такая. Если у документа заполнен соответствующий параметр, то выводим его, даже если значения для данного типа документов генерируются автоматически. Если же параметр не заполнен и значения для документа генерируются автоматически, то генерируем их и возвращаем.
В шаблоне вызов сниппета выглядит так:
... <head> ... <meta name="keywords" content="[[html_getMeta? &type=`keywords`]]" /> <meta name="description" content="[[html_getMeta? &type=`description`]]" /> ... </head> ...
Генерировать автоматически значения META-тэгов можно, например, для документов с определенным типом шаблона. Пример подобного сниппета:
<?php
$out = '';
// Возвращаем ключевые слова
if ($type=='keywords') {
$keywords = $modx->getTemplateVar('meta-keywords', '*', $modx->documentIdentifier);
$keywords = $keywords['value'];
// Если ключевые слова не прописаны вручную - можем их сгенерировать
if ($keywords=='') {
// Для примера генерируем для документов, у которых установлен шаблон с ID = 5
if ($modx->documentObject['template']==5) {
$keywords = 'документ ID шаблон '.$modx->documentObject['pagetitle'];
}
//
// Здесь могут идти генерации ключевых слов ещё для каких-либо документов
//
}
$out.= $keywords;
}
// Возвращаем описание
if ($type=='description') {
$description = $modx->getTemplateVar('meta-description', '*', $modx->documentIdentifier);
$description = $description['value'];
// Если описание не прописано вручную - можем их сгенерировать
if ($description=='') {
// Для примера генерируем для документов, у которых установлен шаблон с ID = 5
if ($modx->documentObject['template']==5) {
$description = 'Описание документа с ID равным 5 и заголовком '.$modx->documentObject['pagetitle'];
}
//
// Здесь могут идти генерации описаний ещё для каких-либо документов
//
}
$out.= $description;
}
echo $out;
?>
В принципе подобную технику работы с META-тэгами можно применить и для произвольных TV-параметров, которые можно генерировать автоматически.
Комментарии
Большое спасибо, весма полезно. Хочется чтобы имя ТВ задавать при вызове сниппета. Как это сделать? $modx->getTemplateVar('$tv_parametr', '*', $modx->documentIdentifier); или $modx->getTemplateVar(tv_paramrtr, '*', $modx->documentIdentifier); или ни каким из вышеперечисленных способов?
И ещё вопрос: А что делает эта строчка "$keywords = $keywords['value'];" ?
Вот так получаем информацию о TV-параметре (возвращается массив):
$modx->getTemplateVar($tv_paramrtr, '*', $modx->documentIdentifier);
"$keywords = $keywords['value'];" - так мы получаем конкретное значение параметра.
Я так понял оно работает на стороне фронт-энд, в принципе нормально.
НО.
ОЧЕНЬ хотелось, чтобы манипуляции по генерации keyword и description производились в бэк-энде!
Есть аналог у других CMS, например DLE. Работает по принципу разовой генерации, при создании документа. То есть при нажатии "сохранить" автоматом происходит "чудо", при условии, что они не были введены вручную.
Alex, этот способ легко можно сделать и по принципу разовой генерации. Только необходимо использовать не сниппет, а плагин, который будет активироваться при сохранении страницы.